diff --git a/.github/workflows/ci-browser-security.yml b/.github/workflows/ci-browser-security.yml index 916fd867c..bd0fc218f 100644 --- a/.github/workflows/ci-browser-security.yml +++ b/.github/workflows/ci-browser-security.yml @@ -18,7 +18,7 @@ concurrency: jobs: browser-security: name: Packaged app · 3 browsers · axe-core · OWASP ZAP - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 timeout-minutes: 75 permissions: contents: read # Build and scan the checked-out application. diff --git a/.github/workflows/ci-database-compatibility.yml b/.github/workflows/ci-database-compatibility.yml index 6f6ca9d07..f32a499ed 100644 --- a/.github/workflows/ci-database-compatibility.yml +++ b/.github/workflows/ci-database-compatibility.yml @@ -18,7 +18,7 @@ concurrency: jobs: database: name: ${{ matrix.database.name }} schema and behavior - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 timeout-minutes: 35 permissions: contents: read # Read application, schema and test sources. diff --git a/.github/workflows/ci-deep-regression.yml b/.github/workflows/ci-deep-regression.yml index 9e02d7164..896da77d3 100644 --- a/.github/workflows/ci-deep-regression.yml +++ b/.github/workflows/ci-deep-regression.yml @@ -19,7 +19,7 @@ concurrency: jobs: regression: name: Browser regression shard ${{ matrix.shard }}/4 - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 timeout-minutes: 120 strategy: fail-fast: false @@ -250,7 +250,7 @@ jobs: installer-locales: name: Fresh installer (${{ matrix.locale }}) - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 timeout-minutes: 45 strategy: fail-fast: false diff --git a/.github/workflows/ci-e2e.yml b/.github/workflows/ci-e2e.yml index e9c536bca..5ef21d5a3 100644 --- a/.github/workflows/ci-e2e.yml +++ b/.github/workflows/ci-e2e.yml @@ -17,7 +17,7 @@ concurrency: jobs: e2e: name: Full E2E suite (Playwright · Apache · MySQL) - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 timeout-minutes: 60 services: diff --git a/.github/workflows/ci-quality.yml b/.github/workflows/ci-quality.yml index 48d8b7c40..51d95334c 100644 --- a/.github/workflows/ci-quality.yml +++ b/.github/workflows/ci-quality.yml @@ -40,7 +40,7 @@ concurrency: jobs: quality: name: Static quality checks - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 # MySQL for the DB-backed unit tests (migration-*, book-field-types, # loan-edge-cases, session-fixes). Without it those tests can't read a DB @@ -376,7 +376,7 @@ jobs: php-compatibility: name: PHP ${{ matrix.php }} compatibility - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 strategy: fail-fast: false matrix: @@ -403,7 +403,7 @@ jobs: frontend: name: Frontend audit, lint and reproducible build - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 steps: - uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803 # v6 with: diff --git a/.github/workflows/ci-real-upgrade.yml b/.github/workflows/ci-real-upgrade.yml index dea190655..06304ae1c 100644 --- a/.github/workflows/ci-real-upgrade.yml +++ b/.github/workflows/ci-real-upgrade.yml @@ -29,7 +29,7 @@ concurrency: jobs: emeroteca-412: name: Emeroteca 412 — previous release upgraded through the admin UI - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 timeout-minutes: 45 services: diff --git a/.github/workflows/ci-security-supply-chain.yml b/.github/workflows/ci-security-supply-chain.yml index 14c2689f6..da88fa89e 100644 --- a/.github/workflows/ci-security-supply-chain.yml +++ b/.github/workflows/ci-security-supply-chain.yml @@ -18,7 +18,7 @@ concurrency: jobs: workflow-security: name: Workflow, YAML and shell security - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 timeout-minutes: 15 permissions: contents: read # Read workflow and script sources. @@ -58,7 +58,7 @@ jobs: dependency-review: name: Dependency diff policy if: github.event_name == 'pull_request' - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 timeout-minutes: 10 permissions: contents: read # Compare dependency manifests in the pull request. @@ -75,7 +75,7 @@ jobs: repository-security: name: Secrets, vulnerabilities and misconfigurations - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 timeout-minutes: 25 permissions: contents: read # Scan the repository and complete Git history. @@ -108,7 +108,7 @@ jobs: release-artifact: name: Reproducible release, SBOM and archive audit - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 timeout-minutes: 35 permissions: contents: read # Build the release from checked-out sources. diff --git a/.github/workflows/ci-upgrade-smoke.yml b/.github/workflows/ci-upgrade-smoke.yml index 9ddfe81f3..0029b971d 100644 --- a/.github/workflows/ci-upgrade-smoke.yml +++ b/.github/workflows/ci-upgrade-smoke.yml @@ -35,7 +35,7 @@ concurrency: jobs: upgrade-smoke: name: Upgrade from latest release → verify schema - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 services: mysql: diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 28ea70e81..7117aa06f 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -19,7 +19,7 @@ concurrency: jobs: analyze: name: Analyze (javascript-typescript) - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 permissions: security-events: write # Upload CodeQL SARIF results. actions: read # Read workflow metadata for private-repository analysis. diff --git a/.github/workflows/pullfrog.yml b/.github/workflows/pullfrog.yml index 1dfa89ccd..740eb2cdc 100644 --- a/.github/workflows/pullfrog.yml +++ b/.github/workflows/pullfrog.yml @@ -28,7 +28,7 @@ permissions: jobs: pullfrog: name: Pullfrog agent - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 timeout-minutes: 45 # Two bounded attempts plus checkout and cleanup. env: # Whether a second subscription token is configured. Only the presence is diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 9a615e0b2..220a7dab1 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -14,7 +14,7 @@ concurrency: jobs: build: name: Verify and build release (read-only) - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 timeout-minutes: 45 permissions: contents: read # Checkout and inspect the tagged source; never publish from this job. @@ -152,7 +152,7 @@ jobs: publish: name: Attest and publish verified release needs: build - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 timeout-minutes: 15 permissions: contents: write # Create the GitHub Release and upload its assets. diff --git a/.github/workflows/test-migrations.yml b/.github/workflows/test-migrations.yml index 02e262490..e660c5be3 100644 --- a/.github/workflows/test-migrations.yml +++ b/.github/workflows/test-migrations.yml @@ -25,7 +25,7 @@ jobs: # version is silently ignored by the updater (version_compare guard). verify-versions: name: Verify migration versions ≤ release - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 steps: - uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803 # v6 with: @@ -62,7 +62,7 @@ jobs: # assertion is the real pass/fail gate. test-full-chain: name: Full migration chain (schema → all migrations) - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 services: mysql: @@ -196,7 +196,7 @@ jobs: # ─── Job 3: existing single-migration test (upgrade 0.3.x → 0.4.0) ───────── test-migrations: name: Legacy migration regression (0.3.x to 0.4.0) - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 services: mysql: diff --git a/.gitleaksignore b/.gitleaksignore new file mode 100644 index 000000000..e22b9b419 --- /dev/null +++ b/.gitleaksignore @@ -0,0 +1,39 @@ +# Gitleaks fingerprints (commit:path:rule:line) for findings in the full-history +# scan that are documentation examples or published test vectors, not secrets. +# The pull_request and push runs only scan the changed range; the scheduled and +# manual runs scan every commit and were failing on these 28 entries. +# +# api-book-scraper docs and views: placeholder keys in curl examples +b868a6b5d2180172b101171ac9eb98ae3e65ce5f:storage/plugins/api-book-scraper/README.md:stripe-access-token:43 +b868a6b5d2180172b101171ac9eb98ae3e65ce5f:storage/plugins/api-book-scraper/SERVER_IMPLEMENTATION_GUIDE.md:stripe-access-token:89 +b868a6b5d2180172b101171ac9eb98ae3e65ce5f:storage/plugins/api-book-scraper/SERVER_IMPLEMENTATION_GUIDE.md:stripe-access-token:113 +b868a6b5d2180172b101171ac9eb98ae3e65ce5f:storage/plugins/api-book-scraper/SERVER_IMPLEMENTATION_GUIDE.md:curl-auth-header:1034 +b868a6b5d2180172b101171ac9eb98ae3e65ce5f:storage/plugins/api-book-scraper/SERVER_IMPLEMENTATION_GUIDE.md:curl-auth-header:1039 +b868a6b5d2180172b101171ac9eb98ae3e65ce5f:storage/plugins/api-book-scraper/SERVER_IMPLEMENTATION_GUIDE.md:curl-auth-header:1043 +b868a6b5d2180172b101171ac9eb98ae3e65ce5f:app/Views/admin/plugins.php:stripe-access-token:426 +84f14515c448bbadf6ee55cec463ba858a32faa4:app/Views/admin/plugins.php:stripe-access-token:474 +c9453c46fe2225531790a2edc90c25b1cb667f05:app/Views/admin/plugins.php:stripe-access-token:474 +# Settings page and admin docs: "your-api-key-here" style curl examples +16ba645f1f990600f69d3842ce3bcd319fbe15f0:app/Views/settings/advanced-tab.php:curl-auth-header:607 +b868a6b5d2180172b101171ac9eb98ae3e65ce5f:app/Views/settings/advanced-tab.php:curl-auth-header:684 +e851035fbe920538a6bf8fc5980312891e4eb878:admin/configurazione.md:curl-auth-header:546 +# z39-server plugin: array literals matched by the generic rule +412253a18455260a5a793b04df36acc23712e7d2:storage/plugins/z39-server/Z39ServerPlugin.php:generic-api-key:122 +b868a6b5d2180172b101171ac9eb98ae3e65ce5f:storage/plugins/z39-server/Z39ServerPlugin.php:generic-api-key:126 +b868a6b5d2180172b101171ac9eb98ae3e65ce5f:storage/plugins/z39-server/Z39ServerPlugin.php:generic-api-key:169 +# French translation strings matched by the generic rule +ad01c97eb68aefad0c1067adfd8377d8f882fa89:locale/fr_FR.json:generic-api-key:2861 +3511b34a1e45f1f59a02cd2ebedf36f7dfe32f3e:locale/fr_FR.json:generic-api-key:2867 +8cfb76efc76183f5fdffb702d682238b2b5dcaac:locale/fr_FR.json:generic-api-key:2871 +320d3a3df0475fbe34d765e50b243499bd5b1414:locale/fr_FR.json:generic-api-key:2874 +9d70038db598cccc7ab2f2f5941e1ff3a66a75cb:locale/fr_FR.json:generic-api-key:4439 +# Update scripts: option names matched by the generic rule +03a8f3e1f75140af13b065d9b52b1d41ebf63e96:scripts/manual-update.php:generic-api-key:443 +5e4ea3f42c694595559f9122932a0eb9fec023e7:scripts/manual-upgrade.php:generic-api-key:569 +f0b1f8b5d473119235892e5dcec8860937eb8f67:test-updater/manual-update.php:generic-api-key:443 +# Tests: RFC 8291 Appendix A web-push vectors and fixture strings +abbe641a9221c29f1ed009bde2873835b53c20f7:tests/mobile-webpush-encryption.unit.php:private-key:25 +abbe641a9221c29f1ed009bde2873835b53c20f7:tests/mobile-webpush-encryption.unit.php:generic-api-key:34 +ac4fcabc00953f3fd5f5c9d59fe5fb5da7f744cb:tests/schema-integrity.spec.js:generic-api-key:91 +5eb52517f88d1ea3fadfffc1f92af21dbd9a1da2:tests/schema-integrity.spec.js:generic-api-key:117 +8cfea8b8d47a8df9efef4d203ca96d8697203908:tests/security-hardening.spec.js:generic-api-key:37 diff --git a/.rsync-filter b/.rsync-filter index 8f301f994..57c4ba508 100644 --- a/.rsync-filter +++ b/.rsync-filter @@ -220,6 +220,8 @@ - /.github/ - /docs/ - /*.md +# Upstream TinyMCE changelog: gitignored, never part of the release. +- /public/assets/tinymce/CHANGELOG.md - .travis.yml - .circleci/ - azure-pipelines.yml diff --git a/app/Controllers/AutoriApiController.php b/app/Controllers/AutoriApiController.php index 578566258..f01c40692 100644 --- a/app/Controllers/AutoriApiController.php +++ b/app/Controllers/AutoriApiController.php @@ -55,33 +55,24 @@ public function list(Request $request, Response $response, mysqli $db): Response $params_for_where = []; $param_types_for_where = ''; - if ($search_text !== '') { - $where_prepared .= " AND (a.nome LIKE ? OR a.pseudonimo LIKE ? OR a.biografia LIKE ?) "; - $escaped = '%' . str_replace(['%', '_'], ['\\%', '\\_'], $search_text) . '%'; - $params_for_where[] = $escaped; - $params_for_where[] = $escaped; - $params_for_where[] = $escaped; - $param_types_for_where .= 'sss'; - } - if ($search_nome !== '') { - $where_prepared .= " AND a.nome LIKE ? "; - $params_for_where[] = '%' . str_replace(['%', '_'], ['\\%', '\\_'], $search_nome) . '%'; - $param_types_for_where .= 's'; - } - if ($search_pseudonimo !== '') { - $where_prepared .= " AND a.pseudonimo LIKE ? "; - $params_for_where[] = '%' . str_replace(['%', '_'], ['\\%', '\\_'], $search_pseudonimo) . '%'; - $param_types_for_where .= 's'; - } - if ($search_sito !== '') { - $where_prepared .= " AND a.sito_web LIKE ? "; - $params_for_where[] = '%' . str_replace(['%', '_'], ['\\%', '\\_'], $search_sito) . '%'; - $param_types_for_where .= 's'; - } - if ($search_naz !== '' && $colNaz !== null) { - $where_prepared .= " AND a.`$colNaz` LIKE ? "; - $params_for_where[] = '%' . str_replace(['%', '_'], ['\\%', '\\_'], $search_naz) . '%'; - $param_types_for_where .= 's'; + // A value wrapped in quotes matches the exact spelling, accents + // included (#501): "Haffner" no longer returns Häffner. + $textFilters = [ + [['a.nome', 'a.pseudonimo', 'a.biografia'], $search_text], + [['a.nome'], $search_nome], + [['a.pseudonimo'], $search_pseudonimo], + [['a.sito_web'], $search_sito], + ]; + if ($colNaz !== null) { + $textFilters[] = [["a.`$colNaz`"], $search_naz]; + } + foreach ($textFilters as [$exprs, $value]) { + $cond = $value !== '' ? \App\Support\ExactSearch::filterCondition($exprs, $value) : null; + if ($cond !== null) { + $where_prepared .= ' AND ' . $cond['sql'] . ' '; + array_push($params_for_where, ...$cond['params']); + $param_types_for_where .= $cond['types']; + } } if ($nascita_from !== '') { $where_prepared .= " AND a.data_nascita >= ? "; diff --git a/app/Controllers/CollaneController.php b/app/Controllers/CollaneController.php index d78478fad..d0a86a9d0 100644 --- a/app/Controllers/CollaneController.php +++ b/app/Controllers/CollaneController.php @@ -483,9 +483,17 @@ public function searchApi(Request $request, Response $response, mysqli $db): Res // SEC2-1 + SEC1-5 (review): require min 2 chars and escape LIKE // wildcards so callers can't broaden the match with `%`/`_` or // probe single-char prefixes for enumeration. - if (mb_strlen($q) >= 2) { - $escaped = str_replace(['\\', '%', '_'], ['\\\\', '\\%', '\\_'], $q); - $search = '%' . $escaped . '%'; + // Each word keeps its own rule (`Mont "Häffner"`): with a quoted word + // filterCondition() builds one condition per word, so the minimum + // applies to every word (`"a" b` must not probe single characters). + // Unquoted input is still one phrase pattern (`%I Meridiani%`), so it + // is measured as a whole and a one-letter article does not block it. + $tokens = \App\Support\ExactSearch::tokenize($q); + $words = in_array(true, array_column($tokens, 'exact'), true) + ? array_column($tokens, 'term') + : [\App\Support\ExactSearch::parseFilter($q)['term']]; + $longEnough = $words !== [] && min(array_map('mb_strlen', $words)) >= 2; + if ($longEnough) { $hasCollane = $this->hasCollaneTable($db); $sqlParts = []; @@ -497,9 +505,13 @@ public function searchApi(Request $request, Response $response, mysqli $db): Res continue; // no collane table — skip its sources } $col = $src['c']; - $where = "`{$col}` LIKE ? AND `{$col}` IS NOT NULL AND `{$col}` != ''"; - $types .= 's'; - $binds[] = $search; + $condition = \App\Support\ExactSearch::filterCondition(["`{$col}`"], $q); + if ($condition === null) { + continue; + } + $where = $condition['sql'] . " AND `{$col}` IS NOT NULL AND `{$col}` != ''"; + $types .= $condition['types']; + array_push($binds, ...$condition['params']); if ($src['t'] === 'libri') { $where .= ' AND deleted_at IS NULL'; } @@ -515,8 +527,15 @@ public function searchApi(Request $request, Response $response, mysqli $db): Res } if (!empty($sqlParts)) { - $sql = 'SELECT DISTINCT nome FROM (' . implode(' UNION ', $sqlParts) - . ') AS combined ORDER BY nome LIMIT 10'; + // One suggestion per spelling: accents keep "Brücke" and + // "Brucke" apart (#501), case does not ("Serie" = "serie", as + // UNION used to merge them). MIN(nome) keeps the column's + // tolerant collation, so the list sorts like the rest of the UI; + // that collation ties "Haffner" with "Häffner", so the binary + // spelling breaks the tie and the order is the same on every + // server. + $sql = 'SELECT MIN(nome) AS nome FROM (' . implode(' UNION ALL ', $sqlParts) + . ') AS combined GROUP BY LOWER(nome) COLLATE utf8mb4_bin ORDER BY nome, MIN(nome) COLLATE utf8mb4_bin LIMIT 10'; $stmt = $db->prepare($sql); if ($stmt) { $stmt->bind_param($types, ...$binds); diff --git a/app/Controllers/CsvImportController.php b/app/Controllers/CsvImportController.php index a62f45fdf..24aa4a5cb 100644 --- a/app/Controllers/CsvImportController.php +++ b/app/Controllers/CsvImportController.php @@ -1488,17 +1488,13 @@ private function mapColumnHeaders(array $headers): array */ private function getOrCreatePublisher(\mysqli $db, string $name): array { - $stmt = $db->prepare("SELECT id FROM editori WHERE nome = ? LIMIT 1"); - $stmt->bind_param('s', $name); - $stmt->execute(); - $result = $stmt->get_result(); - - if ($row = $result->fetch_assoc()) { - $publisherId = (int) $row['id']; - $stmt->close(); - return ['id' => $publisherId, 'created' => false]; + // Same lookup as the book form: the exact spelling wins, and a name in + // quotes reuses only that spelling (#501). The quotes are not stored. + $existingId = (new \App\Models\PublisherRepository($db))->findByName($name); + if ($existingId !== null) { + return ['id' => $existingId, 'created' => false]; } - $stmt->close(); + $name = \App\Support\ExactSearch::quotedValue($name) ?? $name; // Crea nuovo editore $stmt = $db->prepare("INSERT INTO editori (nome, created_at) VALUES (?, NOW())"); @@ -1702,19 +1698,29 @@ private function findExistingBook(\mysqli $db, array $data): ?int $firstAuthor = $authorsArray[0]; if ($firstAuthor !== '') { - // Normalize author name to match DB format (e.g. "Levi, Primo" → "Primo Levi") + // Normalize author name to match DB format (e.g. "Levi, Primo" → "Primo Levi"). + // A name in quotes keeps them through normalize() (#501): the + // quotes are never part of a stored name, and they mean this + // exact spelling, so a quoted author matches only an author + // written the same way (accents distinct, case ignored), like + // AuthorRepository::findByCanonicalName(). An unquoted author + // keeps the accent-tolerant `a.nome = ?` comparison. $normalizedAuthor = \App\Support\AuthorNormalizer::normalize($firstAuthor); + $quotedAuthor = \App\Support\ExactSearch::quotedValue($normalizedAuthor); + $authorMatch = $quotedAuthor !== null + ? \App\Support\ExactSearch::equalsCondition('a.nome', $quotedAuthor) + : ['sql' => 'a.nome = ?', 'params' => [$normalizedAuthor], 'types' => 's']; $stmt = $db->prepare(" SELECT DISTINCT l.id FROM libri l JOIN libri_autori al ON l.id = al.libro_id JOIN autori a ON al.autore_id = a.id WHERE l.titolo = ? - AND a.nome = ? + AND {$authorMatch['sql']} AND l.deleted_at IS NULL LIMIT 1 "); - $stmt->bind_param('ss', $data['titolo'], $normalizedAuthor); + $stmt->bind_param('s' . $authorMatch['types'], $data['titolo'], ...$authorMatch['params']); $stmt->execute(); $result = $stmt->get_result(); if ($row = $result->fetch_assoc()) { @@ -1858,9 +1864,9 @@ classificazione_dewey = ?, $numeroSerie = !empty($data['numero_serie']) ? $data['numero_serie'] : null; // #7: normalize the free-text contributor columns like every other writer // (BookRepository), so "Rossi, Mario" from a CSV matches "Mario Rossi". - $traduttore = !empty($data['traduttore']) ? \App\Support\AuthorNormalizer::normalize((string) $data['traduttore']) : null; - $illustratore = !empty($data['illustratore']) ? \App\Support\AuthorNormalizer::normalize((string) $data['illustratore']) : null; - $curatore = !empty($data['curatore']) ? \App\Support\AuthorNormalizer::normalize((string) $data['curatore']) : null; + $traduttore = !empty($data['traduttore']) ? \App\Support\AuthorNormalizer::normalizeStored((string) $data['traduttore']) : null; + $illustratore = !empty($data['illustratore']) ? \App\Support\AuthorNormalizer::normalizeStored((string) $data['illustratore']) : null; + $curatore = !empty($data['curatore']) ? \App\Support\AuthorNormalizer::normalizeStored((string) $data['curatore']) : null; $paroleChiave = !empty($data['parole_chiave'] ?? null) ? $data['parole_chiave'] : null; $dewey = !empty($data['classificazione_dewey'] ?? null) ? $data['classificazione_dewey'] : null; @@ -2179,9 +2185,9 @@ classificazione_dewey, stato, created_at{$desiderataCol}{$cataloguedCol} $collana = !empty($data['collana']) ? $data['collana'] : null; $numeroSerie = !empty($data['numero_serie']) ? $data['numero_serie'] : null; // #7: normalize free-text contributor columns like every other writer. - $traduttore = !empty($data['traduttore']) ? \App\Support\AuthorNormalizer::normalize((string) $data['traduttore']) : null; - $illustratore = !empty($data['illustratore']) ? \App\Support\AuthorNormalizer::normalize((string) $data['illustratore']) : null; - $curatore = !empty($data['curatore']) ? \App\Support\AuthorNormalizer::normalize((string) $data['curatore']) : null; + $traduttore = !empty($data['traduttore']) ? \App\Support\AuthorNormalizer::normalizeStored((string) $data['traduttore']) : null; + $illustratore = !empty($data['illustratore']) ? \App\Support\AuthorNormalizer::normalizeStored((string) $data['illustratore']) : null; + $curatore = !empty($data['curatore']) ? \App\Support\AuthorNormalizer::normalizeStored((string) $data['curatore']) : null; $paroleChiave = !empty($data['parole_chiave'] ?? null) ? $data['parole_chiave'] : null; $dewey = !empty($data['classificazione_dewey'] ?? null) ? $data['classificazione_dewey'] : null; diff --git a/app/Controllers/DeweyApiController.php b/app/Controllers/DeweyApiController.php index 76047bcb5..ee992e461 100644 --- a/app/Controllers/DeweyApiController.php +++ b/app/Controllers/DeweyApiController.php @@ -319,19 +319,20 @@ public function autocomplete(Request $request, Response $response): Response $query = trim((string) ($request->getQueryParams()['q'] ?? '')); $results = []; try { + ['term' => $query, 'exact' => $exact] = \App\Support\ExactSearch::parseFilter($query); if (mb_strlen($query) >= 2) { $data = $this->loadDeweyData(); if ($this->isNewFormat($data)) { - $needle = self::foldForSearch($query); + $needle = $exact ? mb_strtolower($query, 'UTF-8') : self::foldForSearch($query); $byCode = []; $byName = []; - $walk = function (array $nodes) use (&$walk, &$byCode, &$byName, $query, $needle): void { + $walk = function (array $nodes) use (&$walk, &$byCode, &$byName, $query, $needle, $exact): void { foreach ($nodes as $node) { $code = (string) ($node['code'] ?? ''); $name = (string) ($node['name'] ?? ''); if ($code !== '' && str_starts_with($code, $query)) { $byCode[$code] = ['code' => $code, 'name' => $name]; - } elseif ($name !== '' && str_contains(self::foldForSearch($name), $needle)) { + } elseif ($name !== '' && str_contains($exact ? mb_strtolower($name, 'UTF-8') : self::foldForSearch($name), $needle)) { $byName[$code] = ['code' => $code, 'name' => $name]; } if (!empty($node['children']) && is_array($node['children'])) { diff --git a/app/Controllers/EditoriApiController.php b/app/Controllers/EditoriApiController.php index d3256acb2..07f892206 100644 --- a/app/Controllers/EditoriApiController.php +++ b/app/Controllers/EditoriApiController.php @@ -34,33 +34,23 @@ public function list(Request $request, Response $response, mysqli $db): Response // HAVING clause for libri_count filter (applied after subquery) $having_clause = ''; - if ($search_text !== '') { - $where_prepared .= " AND e.nome LIKE ? "; - $params_for_where[] = "%$search_text%"; - $param_types_for_where .= 's'; - $params[] = "%$search_text%"; - $param_types .= 's'; - } - if ($search_sito !== '') { - $where_prepared .= " AND e.sito_web LIKE ? "; - $params_for_where[] = "%$search_sito%"; - $param_types_for_where .= 's'; - $params[] = "%$search_sito%"; - $param_types .= 's'; - } - if ($search_via !== '') { - $where_prepared .= " AND e.indirizzo LIKE ? "; - $params_for_where[] = "%$search_via%"; - $param_types_for_where .= 's'; - $params[] = "%$search_via%"; - $param_types .= 's'; - } - if ($search_cap !== '') { - $where_prepared .= " AND e.indirizzo LIKE ? "; - $params_for_where[] = "%$search_cap%"; - $param_types_for_where .= 's'; - $params[] = "%$search_cap%"; - $param_types .= 's'; + // A value wrapped in quotes matches the exact spelling, accents + // included (#501). The same fragment feeds both the count query + // ($params_for_where) and the page query ($params). + foreach ([ + ['e.nome', $search_text], + ['e.sito_web', $search_sito], + ['e.indirizzo', $search_via], + ['e.indirizzo', $search_cap], + ] as [$expr, $value]) { + $cond = $value !== '' ? \App\Support\ExactSearch::filterCondition([$expr], $value) : null; + if ($cond !== null) { + $where_prepared .= ' AND ' . $cond['sql'] . ' '; + array_push($params_for_where, ...$cond['params']); + $param_types_for_where .= $cond['types']; + array_push($params, ...$cond['params']); + $param_types .= $cond['types']; + } } // Book count filter - uses HAVING since libri_count is computed if ($filter_libri_count !== '') { diff --git a/app/Controllers/FrontendController.php b/app/Controllers/FrontendController.php index eee4c3d2e..c90564cc7 100644 --- a/app/Controllers/FrontendController.php +++ b/app/Controllers/FrontendController.php @@ -1660,15 +1660,19 @@ private function buildWhereConditions(array $filters, mysqli $db): array // #143), so the catalog filter results agree with the publisher // facet count (which already counts secondaries). Gate the junction // subquery on table existence (pre-migration safety). + // The name must match exactly, accents included (#501): the + // collation alone would also return the books of "Häffner" for + // the publisher "Haffner". + $primary = \App\Support\ExactSearch::equalsCondition('e.nome', (string) $filters['editore']); if (\App\Support\SchemaInfo::hasLibriEditori($db)) { - $conditions[] = "(e.nome = ? OR EXISTS (SELECT 1 FROM libri_editori le2 JOIN editori e2 ON le2.editore_id = e2.id WHERE le2.libro_id = l.id AND e2.nome = ?))"; - $params[] = $filters['editore']; - $params[] = $filters['editore']; - $types .= 'ss'; + $secondary = \App\Support\ExactSearch::equalsCondition('e2.nome', (string) $filters['editore']); + $conditions[] = "({$primary['sql']} OR EXISTS (SELECT 1 FROM libri_editori le2 JOIN editori e2 ON le2.editore_id = e2.id WHERE le2.libro_id = l.id AND {$secondary['sql']}))"; + array_push($params, ...$primary['params'], ...$secondary['params']); + $types .= $primary['types'] . $secondary['types']; } else { - $conditions[] = "e.nome = ?"; - $params[] = $filters['editore']; - $types .= 's'; + $conditions[] = $primary['sql']; + array_push($params, ...$primary['params']); + $types .= $primary['types']; } } @@ -1714,12 +1718,17 @@ private function buildWhereConditions(array $filters, mysqli $db): array if (!empty($filters['autore'])) { $variants = \App\Services\UnifiedCatalogService::nameVariants((string)$filters['autore']); - $marks = implode(',', array_fill(0, count($variants), '?')); - $conditions[] = "EXISTS (SELECT 1 FROM libri_autori la_name JOIN autori a_name ON a_name.id=la_name.autore_id - WHERE la_name.libro_id=l.id AND la_name.ruolo IN ('principale','co-autore') - AND (TRIM(a_name.nome) IN ($marks) OR TRIM(a_name.pseudonimo) IN ($marks)))"; - array_push($params, ...$variants, ...$variants); - $types .= str_repeat('s', count($variants) * 2); + // Exact spelling, accents included (#501): "Haffner" must not + // also list the books of "Häffner". + $byName = \App\Support\ExactSearch::inCondition('TRIM(a_name.nome)', $variants); + $byPseudonym = \App\Support\ExactSearch::inCondition('TRIM(a_name.pseudonimo)', $variants); + if ($byName !== null && $byPseudonym !== null) { + $conditions[] = "EXISTS (SELECT 1 FROM libri_autori la_name JOIN autori a_name ON a_name.id=la_name.autore_id + WHERE la_name.libro_id=l.id AND la_name.ruolo IN ('principale','co-autore') + AND ({$byName['sql']} OR {$byPseudonym['sql']}))"; + array_push($params, ...$byName['params'], ...$byPseudonym['params']); + $types .= $byName['types'] . $byPseudonym['types']; + } } if (!empty($filters['autore_id'])) { @@ -1982,7 +1991,7 @@ private function computeFilterOptions(mysqli $db, array $filters = []): array ? " OR EXISTS (SELECT 1 FROM libri_editori le WHERE le.libro_id = l.id AND le.editore_id = e.id)" : ""; $queryEditori = " - SELECT e.nome, COUNT(DISTINCT l.id) AS cnt + SELECT MIN(e.nome) AS nome, COUNT(DISTINCT l.id) AS cnt FROM editori e JOIN libri l ON (e.id = l.editore_id{$facetExists}) AND l.deleted_at IS NULL AND " . $visibility . " @@ -2000,8 +2009,10 @@ private function computeFilterOptions(mysqli $db, array $filters = []): array // (editori.nome has no UNIQUE constraint — same-named rows are legitimate), // so grouping per id would render duplicate labels each with a partial count // that no single filtered result could match. Grouping by name merges them - // and makes each badge equal the count the name filter returns. - $queryEditori .= " GROUP BY e.nome HAVING cnt > 0 ORDER BY e.nome"; + // and makes each badge equal the count the name filter returns. The group + // key keeps accents distinct (#501) — "Haffner" and "Häffner" are two + // publishers — while still ignoring case, exactly like the filter does. + $queryEditori .= " GROUP BY LOWER(e.nome) COLLATE utf8mb4_bin HAVING cnt > 0 ORDER BY nome"; $stmt = $db->prepare($queryEditori); if (!empty($paramsEd)) { @@ -2346,9 +2357,13 @@ public function authorArchive(Request $request, Response $response, mysqli $db, // UNIQUE on nome by design), so resolving a single id with LIMIT 1 would // show an arbitrary homonym and hide the others' bibliography — mirrors // publisherArchive(). The header shows the lowest id, deterministically. - $authorQuery = "SELECT id, nome, pseudonimo, biografia, sito_web, foto, collegamenti FROM autori WHERE nome = ? ORDER BY id"; + // Homonyms only: same spelling, accents included (#501). The collation + // alone would treat "Haffner" and "Häffner" as one name and merge two + // people's bibliographies on one page. + $byName = \App\Support\ExactSearch::equalsCondition('nome', $authorName); + $authorQuery = "SELECT id, nome, pseudonimo, biografia, sito_web, foto, collegamenti FROM autori WHERE {$byName['sql']} ORDER BY id"; $stmt = $db->prepare($authorQuery); - $stmt->bind_param('s', $authorName); + $stmt->bind_param($byName['types'], ...$byName['params']); $stmt->execute(); $authorResult = $stmt->get_result(); @@ -2382,9 +2397,11 @@ public function publisherArchive(Request $request, Response $response, mysqli $d // Find EVERY publisher with this name. Duplicates legitimately share a // name (the merge feature exists because of that), so resolving a single // id with LIMIT 1 would hide the books of the other same-named publishers. - $publisherQuery = "SELECT id, nome, indirizzo, sito_web FROM editori WHERE nome = ? ORDER BY id"; + // Same spelling, accents included (#501): see authorArchive(). + $byName = \App\Support\ExactSearch::equalsCondition('nome', $publisherName); + $publisherQuery = "SELECT id, nome, indirizzo, sito_web FROM editori WHERE {$byName['sql']} ORDER BY id"; $stmt = $db->prepare($publisherQuery); - $stmt->bind_param('s', $publisherName); + $stmt->bind_param($byName['types'], ...$byName['params']); $stmt->execute(); $publisherResult = $stmt->get_result(); diff --git a/app/Controllers/GeneriApiController.php b/app/Controllers/GeneriApiController.php index cbdae404f..aebfedf74 100644 --- a/app/Controllers/GeneriApiController.php +++ b/app/Controllers/GeneriApiController.php @@ -14,23 +14,27 @@ public function search(Request $request, Response $response, \mysqli $db): Respo $limit = min(50, (int) ($request->getQueryParams()['limit'] ?? 20)); $results = []; - if (strlen($query) >= 1) { - $searchTerm = "%{$query}%"; + $search = \App\Support\ExactSearch::filterCondition(['g.nome'], $query); + if ($search !== null) { + ['term' => $term, 'exact' => $exact] = \App\Support\ExactSearch::parseFilter($query); + $prefixMatch = \App\Support\ExactSearch::likeSql('g.nome', $exact); $stmt = $db->prepare(" SELECT g.id, g.nome, g.parent_id, p.nome AS parent_nome, CASE WHEN g.parent_id IS NULL THEN 'genere' ELSE 'sottogenere' END AS tipo FROM generi g LEFT JOIN generi p ON g.parent_id = p.id - WHERE g.nome LIKE ? + WHERE {$search['sql']} ORDER BY - CASE WHEN g.nome LIKE ? THEN 0 ELSE 1 END, + CASE WHEN {$prefixMatch} THEN 0 ELSE 1 END, g.parent_id IS NULL DESC, g.nome LIMIT ? "); - $exactMatch = "{$query}%"; - $stmt->bind_param('ssi', $searchTerm, $exactMatch, $limit); + // The WHERE holds one placeholder per word when the box mixes + // words and quotes (`storia "arte"`): bind whatever it carries. + $prefixPattern = substr(\App\Support\ExactSearch::likePattern($term), 1); + $stmt->bind_param($search['types'] . 'si', ...[...$search['params'], $prefixPattern, $limit]); $stmt->execute(); $result = $stmt->get_result(); @@ -251,4 +255,4 @@ public function getSottogeneri(Request $request, Response $response, \mysqli $db $response->getBody()->write(json_encode($results, JSON_HEX_TAG | JSON_HEX_AMP | JSON_HEX_APOS | JSON_HEX_QUOT | JSON_UNESCAPED_UNICODE)); return $response->withHeader('Content-Type', 'application/json'); } -} \ No newline at end of file +} diff --git a/app/Controllers/LibraryThingImportController.php b/app/Controllers/LibraryThingImportController.php index f15dd14b9..b32339a79 100644 --- a/app/Controllers/LibraryThingImportController.php +++ b/app/Controllers/LibraryThingImportController.php @@ -888,7 +888,10 @@ private function normalizeContributorField(?string $value): ?string $normalized = []; foreach ($this->splitContributorList($value, '/\s*[;|]\s*/u') as $part) { - $name = \App\Support\AuthorNormalizer::normalize($part); + // Written to the libri.* display cache only: whole-name quotes mean + // exact spelling (#501) and stay on the value ContributorSync gets + // from parseLibraryThingRow(), never in the stored text. + $name = \App\Support\AuthorNormalizer::normalizeStored($part); if ($name !== '' && !in_array($name, $normalized, true)) { $normalized[] = $name; } @@ -1245,16 +1248,13 @@ private function parseDate(string|int|float|null $dateString): ?string // Reuse methods from CsvImportController private function getOrCreatePublisher(\mysqli $db, string $name): array { - $stmt = $db->prepare("SELECT id FROM editori WHERE nome = ? LIMIT 1"); - $stmt->bind_param('s', $name); - $stmt->execute(); - $result = $stmt->get_result(); - - if ($row = $result->fetch_assoc()) { - $stmt->close(); - return ['id' => (int) $row['id'], 'created' => false]; + // Same lookup as the book form: the exact spelling wins, and a name in + // quotes reuses only that spelling (#501). The quotes are not stored. + $existingId = (new \App\Models\PublisherRepository($db))->findByName($name); + if ($existingId !== null) { + return ['id' => $existingId, 'created' => false]; } - $stmt->close(); + $name = \App\Support\ExactSearch::quotedValue($name) ?? $name; $stmt = $db->prepare("INSERT INTO editori (nome, created_at) VALUES (?, NOW())"); $stmt->bind_param('s', $name); @@ -2156,13 +2156,12 @@ public function exportToLibraryThing(Request $request, Response $response, \mysq $bindTypes = ''; $bindValues = []; - if (!empty($search)) { - $whereClauses[] = "(l.titolo LIKE ? OR l.sottotitolo LIKE ? OR l.isbn13 LIKE ? OR l.isbn10 LIKE ? OR a.nome LIKE ? OR e.nome LIKE ?)"; - $searchParam = "%{$search}%"; - for ($i = 0; $i < 6; $i++) { - $bindTypes .= 's'; - $bindValues[] = $searchParam; - } + // Quoted value = exact spelling, accents included (#501), as in the list. + $searchCond = \App\Support\SearchIndexBuilder::buildSearchCondition($db, 'l.search_index', (string) $search); + if ($searchCond !== null) { + $whereClauses[] = $searchCond['sql']; + $bindTypes .= $searchCond['types']; + array_push($bindValues, ...$searchCond['params']); } if (!empty($stato)) { diff --git a/app/Controllers/LibriApiController.php b/app/Controllers/LibriApiController.php index c5ee3ed47..27964ae12 100644 --- a/app/Controllers/LibriApiController.php +++ b/app/Controllers/LibriApiController.php @@ -49,12 +49,12 @@ public function list(Request $request, Response $response, mysqli $db): Response } } if ($search_isbn !== '') { - $where .= " AND (l.isbn10 LIKE ? OR l.isbn13 LIKE ? OR l.ean LIKE ?) "; - $isbnParam = '%' . $search_isbn . '%'; - $params[] = $isbnParam; - $params[] = $isbnParam; - $params[] = $isbnParam; - $types .= 'sss'; + $isbn = \App\Support\ExactSearch::filterCondition(['l.isbn10', 'l.isbn13', 'l.ean'], $search_isbn); + if ($isbn !== null) { + $where .= ' AND ' . $isbn['sql']; + array_push($params, ...$isbn['params']); + $types .= $isbn['types']; + } } if ($genere_id) { // Search both genere_id and sottogenere_id, plus children of the selected genre @@ -137,9 +137,12 @@ public function list(Request $request, Response $response, mysqli $db): Response $types .= 'i'; } if ($collana !== '') { - $where .= " AND l.collana LIKE ?"; - $params[] = '%' . $collana . '%'; - $types .= 's'; + $series = \App\Support\ExactSearch::filterCondition(['l.collana'], $collana); + if ($series !== null) { + $where .= ' AND ' . $series['sql']; + array_push($params, ...$series['params']); + $types .= $series['types']; + } } if ($tipo_media !== '' && $this->hasColumn($db, 'tipo_media')) { if ($tipo_media === 'libro') { diff --git a/app/Controllers/LibriController.php b/app/Controllers/LibriController.php index dacbdf7c5..5ca8e94d9 100644 --- a/app/Controllers/LibriController.php +++ b/app/Controllers/LibriController.php @@ -3409,13 +3409,12 @@ public function exportCsv(Request $request, Response $response, mysqli $db): Res $bindValues = []; // Global search filter - if (!empty($search)) { - $whereClauses[] = "(l.titolo LIKE ? OR l.sottotitolo LIKE ? OR l.descrizione LIKE ? OR l.isbn13 LIKE ? OR l.isbn10 LIKE ? OR a.nome LIKE ? OR e.nome LIKE ?)"; - $searchParam = "%{$search}%"; - for ($i = 0; $i < 7; $i++) { - $bindTypes .= 's'; - $bindValues[] = $searchParam; - } + // Quoted value = exact spelling, accents included (#501), as in the list. + $searchCond = \App\Support\SearchIndexBuilder::buildSearchCondition($db, 'l.search_index', (string) $search); + if ($searchCond !== null) { + $whereClauses[] = $searchCond['sql']; + $bindTypes .= $searchCond['types']; + array_push($bindValues, ...$searchCond['params']); } // Status filter diff --git a/app/Controllers/PrestitiApiController.php b/app/Controllers/PrestitiApiController.php index 67e2e9bf6..ff8894ebe 100644 --- a/app/Controllers/PrestitiApiController.php +++ b/app/Controllers/PrestitiApiController.php @@ -64,15 +64,14 @@ public function list(Request $request, Response $response, mysqli $db): Response $params[] = $statoSpecifico; $param_types .= 's'; } - if ($search_value !== '') { - $where_prepared .= " AND (l.titolo LIKE ? - OR CONCAT(u.nome, ' ', u.cognome) LIKE ? - OR CONCAT(staff.nome, ' ', staff.cognome) LIKE ?) "; - $search_param = "%$search_value%"; - $params[] = $search_param; - $params[] = $search_param; - $params[] = $search_param; - $param_types .= 'sss'; + // Quoted value = exact spelling, accents included (#501). + $search = $search_value !== '' + ? \App\Support\ExactSearch::filterCondition(['l.titolo', "CONCAT(u.nome, ' ', u.cognome)", "CONCAT(staff.nome, ' ', staff.cognome)"], $search_value) + : null; + if ($search !== null) { + $where_prepared .= ' AND ' . $search['sql'] . ' '; + array_push($params, ...$search['params']); + $param_types .= $search['types']; } // Count total records with prepared statement diff --git a/app/Controllers/PublicApiController.php b/app/Controllers/PublicApiController.php index 621b09ceb..616648e07 100644 --- a/app/Controllers/PublicApiController.php +++ b/app/Controllers/PublicApiController.php @@ -80,18 +80,20 @@ private function findBooks(mysqli $db, ?string $ean, ?string $isbn13, ?string $i $types .= 's'; } - if ($author !== null && $author !== '') { - $authorLike = '%' . str_replace(['\\', '%', '_'], ['\\\\', '\\%', '\\_'], $author) . '%'; + // Quoted value = exact spelling, accents included (#501). + $authorCond = ($author !== null && $author !== '') + ? \App\Support\ExactSearch::filterCondition(['a.nome', 'a.pseudonimo'], $author) + : null; + if ($authorCond !== null) { $conditions[] = 'EXISTS ( SELECT 1 FROM libri_autori la JOIN autori a ON la.autore_id = a.id WHERE la.libro_id = l.id AND la.ruolo IN (\'principale\', \'co-autore\') - AND (a.nome LIKE ? ESCAPE \'\\\\\' OR a.pseudonimo LIKE ? ESCAPE \'\\\\\') + AND ' . $authorCond['sql'] . ' )'; - $params[] = $authorLike; - $params[] = $authorLike; - $types .= 'ss'; + array_push($params, ...$authorCond['params']); + $types .= $authorCond['types']; } if (empty($conditions)) { diff --git a/app/Controllers/ReservationsAdminController.php b/app/Controllers/ReservationsAdminController.php index 9c89c3aba..6a1810f73 100644 --- a/app/Controllers/ReservationsAdminController.php +++ b/app/Controllers/ReservationsAdminController.php @@ -35,15 +35,17 @@ public function index(Request $request, Response $response, mysqli $db): Respons $types .= 'i'; $params[] = $utenteId; } - if ($libroId <= 0 && $qLibro !== '') { - $conds[] = 'l.titolo LIKE ?'; - $types .= 's'; - $params[] = '%' . $qLibro . '%'; - } - if ($utenteId <= 0 && $qUtente !== '') { - $conds[] = "CONCAT(u.nome,' ',u.cognome) LIKE ?"; - $types .= 's'; - $params[] = '%' . $qUtente . '%'; + // Quoted value = exact spelling, accents included (#501). + foreach ([ + ['l.titolo', $libroId <= 0 ? $qLibro : ''], + ["CONCAT(u.nome,' ',u.cognome)", $utenteId <= 0 ? $qUtente : ''], + ] as [$expr, $value]) { + $cond = $value !== '' ? \App\Support\ExactSearch::filterCondition([$expr], $value) : null; + if ($cond !== null) { + $conds[] = $cond['sql']; + $types .= $cond['types']; + array_push($params, ...$cond['params']); + } } if ($conds) { $sql .= ' WHERE ' . implode(' AND ', $conds); @@ -68,6 +70,14 @@ public function index(Request $request, Response $response, mysqli $db): Respons } } + // The view reads these names. They were never set, so the list always + // rendered empty and the filter boxes lost what had been typed. + $items = $rows; + $q_libro = $qLibro; + $q_utente = $qUtente; + $libro_id = $libroId; + $utente_id = $utenteId; + ob_start(); require __DIR__ . '/../Views/prenotazioni/index.php'; $content = ob_get_clean(); diff --git a/app/Controllers/SearchController.php b/app/Controllers/SearchController.php index 0d4e5059d..470c6ab23 100644 --- a/app/Controllers/SearchController.php +++ b/app/Controllers/SearchController.php @@ -31,19 +31,13 @@ public function authors(Request $request, Response $response, mysqli $db): Respo // SessionRoleRefreshMiddleware) receive them, as on the admin-only /api/autori. $lifeDates = $this->isOperatorSession($request) ? ', data_nascita, data_morte' : ''; $select = "id, nome{$lifeDates}, {$label}"; - if ($q !== '') { - // Split query into words — each word must match (AND logic) - $words = preg_split('/\s+/', $q, -1, PREG_SPLIT_NO_EMPTY); - $conditions = []; - $params = []; - $types = ''; - foreach ($words as $word) { - $conditions[] = '(nome LIKE ? ESCAPE \'\\\\\' OR pseudonimo LIKE ? ESCAPE \'\\\\\')'; - $like = '%' . str_replace(['\\', '%', '_'], ['\\\\', '\\%', '\\_'], $word) . '%'; - $params[] = $like; - $params[] = $like; - $types .= 'ss'; - } + // Every word must match (AND); a quoted group is matched with its + // exact spelling, accents included (#501). + $cond = $q !== '' ? \App\Support\ExactSearch::wordsCondition(['nome', 'pseudonimo'], $q, \App\Support\ExactSearch::MAX_FILTER_TERMS) : null; + if ($cond !== null) { + $conditions = [$cond['sql']]; + $params = $cond['params']; + $types = $cond['types']; $sql = "SELECT {$select} FROM autori WHERE " . implode(' AND ', $conditions) . " ORDER BY " . \App\Support\AuthorName::preferredSql('autori'); $stmt = $db->prepare($sql); @@ -72,17 +66,13 @@ public function publishers(Request $request, Response $response, mysqli $db): Re { $q = trim((string)($request->getQueryParams()['q'] ?? '')); $rows = []; - if ($q !== '') { - // Split query into words — each word must match (AND logic) - $words = preg_split('/\s+/', $q, -1, PREG_SPLIT_NO_EMPTY); - $conditions = []; - $params = []; - $types = ''; - foreach ($words as $word) { - $conditions[] = 'nome LIKE ?'; - $params[] = '%' . $word . '%'; - $types .= 's'; - } + // Every word must match (AND); a quoted group is matched with its + // exact spelling, accents included (#501). + $cond = $q !== '' ? \App\Support\ExactSearch::wordsCondition(['nome'], $q, \App\Support\ExactSearch::MAX_FILTER_TERMS) : null; + if ($cond !== null) { + $conditions = [$cond['sql']]; + $params = $cond['params']; + $types = $cond['types']; $sql = "SELECT id, nome AS label FROM editori WHERE " . implode(' AND ', $conditions) . " ORDER BY nome"; $stmt = $db->prepare($sql); $stmt->bind_param($types, ...$params); @@ -101,8 +91,13 @@ public function users(Request $request, Response $response, mysqli $db): Respons { $q = trim((string)($request->getQueryParams()['q'] ?? '')); $rows=[]; - if ($q !== '') { - $s = '%'.$q.'%'; + // Quoted value = exact spelling, accents included (#501). The full + // name in either order is searched too, so "Mario Rossi" — what the + // label shows — finds Mario Rossi, as the mobile staff picker does. + $search = $q !== '' + ? \App\Support\ExactSearch::filterCondition(['nome', 'cognome', 'telefono', 'email', 'codice_tessera', "CONCAT(nome, ' ', cognome)", "CONCAT(cognome, ' ', nome)"], $q) + : null; + if ($search !== null) { $stmt = $db->prepare(" SELECT id, CONCAT( @@ -113,15 +108,11 @@ public function users(Request $request, Response $response, mysqli $db): Respons END ) AS label FROM utenti - WHERE (nome LIKE ? - OR cognome LIKE ? - OR telefono LIKE ? - OR email LIKE ? - OR codice_tessera LIKE ?)" . \App\Support\Permissions::accountScopeSql('', \App\Support\Permissions::SCOPE_BORROWER) . " + WHERE {$search['sql']}" . \App\Support\Permissions::accountScopeSql('', \App\Support\Permissions::SCOPE_BORROWER) . " ORDER BY cognome, nome LIMIT 20 "); - $stmt->bind_param('sssss', $s, $s, $s, $s, $s); + $stmt->bind_param($search['types'], ...$search['params']); $stmt->execute(); $res = $stmt->get_result(); while ($r = $res->fetch_assoc()) { @@ -399,17 +390,15 @@ private function searchBooks(mysqli $db, string $query, bool $includeRequests = private function searchAuthors(mysqli $db, string $query): array { $results = []; - $words = preg_split('/\s+/', $query, -1, PREG_SPLIT_NO_EMPTY); - $conditions = []; - $params = []; - $types = ''; - foreach ($words as $word) { - $conditions[] = '(nome LIKE ? ESCAPE \'\\\\\' OR pseudonimo LIKE ? ESCAPE \'\\\\\')'; - $like = '%' . str_replace(['\\', '%', '_'], ['\\\\', '\\%', '\\_'], $word) . '%'; - $params[] = $like; - $params[] = $like; - $types .= 'ss'; + // Every word must match (AND); a quoted group is matched with its + // exact spelling, accents included (#501). + $cond = \App\Support\ExactSearch::wordsCondition(['nome', 'pseudonimo'], $query, \App\Support\ExactSearch::MAX_FILTER_TERMS); + if ($cond === null) { + return []; } + $conditions = [$cond['sql']]; + $params = $cond['params']; + $types = $cond['types']; $sql = "SELECT id, " . \App\Support\AuthorName::displaySql('autori') . " AS label FROM autori WHERE " . implode(' AND ', $conditions) . " ORDER BY " . \App\Support\AuthorName::preferredSql('autori') . " LIMIT 5"; @@ -433,15 +422,15 @@ private function searchAuthors(mysqli $db, string $query): array private function searchPublishers(mysqli $db, string $query): array { $results = []; - $words = preg_split('/\s+/', $query, -1, PREG_SPLIT_NO_EMPTY); - $conditions = []; - $params = []; - $types = ''; - foreach ($words as $word) { - $conditions[] = 'nome LIKE ?'; - $params[] = '%' . $word . '%'; - $types .= 's'; + // Every word must match (AND); a quoted group is matched with its + // exact spelling, accents included (#501). + $cond = \App\Support\ExactSearch::wordsCondition(['nome'], $query, \App\Support\ExactSearch::MAX_FILTER_TERMS); + if ($cond === null) { + return []; } + $conditions = [$cond['sql']]; + $params = $cond['params']; + $types = $cond['types']; $sql = "SELECT id, nome AS label FROM editori WHERE " . implode(' AND ', $conditions) . " ORDER BY nome LIMIT 5"; $stmt = $db->prepare($sql); $stmt->bind_param($types, ...$params); @@ -528,17 +517,15 @@ private function searchBooksWithDetails(mysqli $db, string $query): array private function searchAuthorsWithDetails(mysqli $db, string $query): array { $results = []; - $words = preg_split('/\s+/', $query, -1, PREG_SPLIT_NO_EMPTY); - $conditions = []; - $params = []; - $types = ''; - foreach ($words as $word) { - $conditions[] = '(a.nome LIKE ? ESCAPE \'\\\\\' OR a.pseudonimo LIKE ? ESCAPE \'\\\\\')'; - $like = '%' . str_replace(['\\', '%', '_'], ['\\\\', '\\%', '\\_'], $word) . '%'; - $params[] = $like; - $params[] = $like; - $types .= 'ss'; + // Every word must match (AND); a quoted group is matched with its + // exact spelling, accents included (#501). + $cond = \App\Support\ExactSearch::wordsCondition(['a.nome', 'a.pseudonimo'], $query, \App\Support\ExactSearch::MAX_FILTER_TERMS); + if ($cond === null) { + return []; } + $conditions = [$cond['sql']]; + $params = $cond['params']; + $types = $cond['types']; $sql = " SELECT a.id, a.nome, a.pseudonimo, a.biografia, @@ -572,15 +559,15 @@ private function searchAuthorsWithDetails(mysqli $db, string $query): array private function searchPublishersWithDetails(mysqli $db, string $query): array { $results = []; - $words = preg_split('/\s+/', $query, -1, PREG_SPLIT_NO_EMPTY); - $conditions = []; - $params = []; - $types = ''; - foreach ($words as $word) { - $conditions[] = 'e.nome LIKE ?'; - $params[] = '%' . $word . '%'; - $types .= 's'; + // Every word must match (AND); a quoted group is matched with its + // exact spelling, accents included (#501). + $cond = \App\Support\ExactSearch::wordsCondition(['e.nome'], $query, \App\Support\ExactSearch::MAX_FILTER_TERMS); + if ($cond === null) { + return []; } + $conditions = [$cond['sql']]; + $params = $cond['params']; + $types = $cond['types']; // issue #143: count books where the publisher is primary OR a secondary // one in the junction; gate the subquery on table existence so the count @@ -622,10 +609,10 @@ public function genres(Request $request, Response $response, mysqli $db): Respon { $q = trim((string)($request->getQueryParams()['q'] ?? '')); $rows=[]; - if ($q !== '') { - $s = '%'.$q.'%'; - $stmt = $db->prepare("SELECT id, nome AS label FROM generi WHERE nome LIKE ? ORDER BY nome LIMIT 20"); - $stmt->bind_param('s', $s); + $search = \App\Support\ExactSearch::filterCondition(['nome'], $q); + if ($search !== null) { + $stmt = $db->prepare("SELECT id, nome AS label FROM generi WHERE {$search['sql']} ORDER BY nome LIMIT 20"); + $stmt->bind_param($search['types'], ...$search['params']); $stmt->execute(); $res = $stmt->get_result(); while ($r = $res->fetch_assoc()) { @@ -641,8 +628,8 @@ public function locations(Request $request, Response $response, mysqli $db): Res { $q = trim((string)($request->getQueryParams()['q'] ?? '')); $rows = []; - if ($q !== '') { - $s = '%' . $q . '%'; + $search = \App\Support\ExactSearch::filterCondition(['s.nome', 's.codice', 'CAST(m.numero_livello AS CHAR)'], $q); + if ($search !== null) { $stmt = $db->prepare(" SELECT p.id, CONCAT( @@ -653,11 +640,11 @@ public function locations(Request $request, Response $response, mysqli $db): Res FROM posizioni p JOIN scaffali s ON p.scaffale_id = s.id JOIN mensole m ON p.mensola_id = m.id - WHERE s.nome LIKE ? OR s.codice LIKE ? OR CAST(m.numero_livello AS CHAR) LIKE ? + WHERE {$search['sql']} ORDER BY s.ordine, m.numero_livello LIMIT 20 "); - $stmt->bind_param('sss', $s, $s, $s); + $stmt->bind_param($search['types'], ...$search['params']); $stmt->execute(); $res = $stmt->get_result(); while ($r = $res->fetch_assoc()) { diff --git a/app/Controllers/UsersController.php b/app/Controllers/UsersController.php index cb9de24fa..01202f669 100644 --- a/app/Controllers/UsersController.php +++ b/app/Controllers/UsersController.php @@ -967,13 +967,14 @@ public function exportCsv(Request $request, Response $response, mysqli $db): Res $bindValues = []; // Search text filter (nome, cognome, email) - if (!empty($searchText)) { - $whereClauses[] = "(nome LIKE ? OR cognome LIKE ? OR email LIKE ?)"; - $searchParam = "%{$searchText}%"; - for ($i = 0; $i < 3; $i++) { - $bindTypes .= 's'; - $bindValues[] = $searchParam; - } + // Quoted value = exact spelling, accents included (#501), as in the list. + $search = !empty($searchText) + ? \App\Support\ExactSearch::filterCondition(['nome', 'cognome', 'email', 'telefono', 'codice_tessera', "CONCAT(nome, ' ', cognome)", "CONCAT(cognome, ' ', nome)"], (string) $searchText) + : null; + if ($search !== null) { + $whereClauses[] = $search['sql']; + $bindTypes .= $search['types']; + array_push($bindValues, ...$search['params']); } // Role filter diff --git a/app/Controllers/UtentiApiController.php b/app/Controllers/UtentiApiController.php index a635e9595..79c425f76 100644 --- a/app/Controllers/UtentiApiController.php +++ b/app/Controllers/UtentiApiController.php @@ -24,15 +24,14 @@ public function list(Request $request, Response $response, mysqli $db): Response $params = []; $types = ''; - if ($search_value !== '') { - $searchParam = "%$search_value%"; - $where .= " AND (u.nome LIKE ? - OR u.cognome LIKE ? - OR u.email LIKE ? - OR u.telefono LIKE ? - OR u.codice_tessera LIKE ?)"; - $params = array_fill(0, 5, $searchParam); - $types = 'sssss'; + // Quoted value = exact spelling, accents included (#501). + $search = $search_value !== '' + ? \App\Support\ExactSearch::filterCondition(['u.nome', 'u.cognome', 'u.email', 'u.telefono', 'u.codice_tessera', "CONCAT(u.nome, ' ', u.cognome)", "CONCAT(u.cognome, ' ', u.nome)"], $search_value) + : null; + if ($search !== null) { + $where .= ' AND ' . $search['sql']; + $params = $search['params']; + $types = $search['types']; } // Additional filters @@ -180,11 +179,14 @@ public function exportPdf(Request $request, Response $response, mysqli $db): Res $types = ''; $search_value = trim((string)($q['search_text'] ?? ($q['search_value'] ?? ''))); - if ($search_value !== '') { - $searchParam = "%$search_value%"; - $where .= ' AND (u.nome LIKE ? OR u.cognome LIKE ? OR u.email LIKE ? OR u.telefono LIKE ? OR u.codice_tessera LIKE ?)'; - $params = array_fill(0, 5, $searchParam); - $types = 'sssss'; + // Quoted value = exact spelling, accents included (#501). + $search = $search_value !== '' + ? \App\Support\ExactSearch::filterCondition(['u.nome', 'u.cognome', 'u.email', 'u.telefono', 'u.codice_tessera', "CONCAT(u.nome, ' ', u.cognome)", "CONCAT(u.cognome, ' ', u.nome)"], $search_value) + : null; + if ($search !== null) { + $where .= ' AND ' . $search['sql']; + $params = $search['params']; + $types = $search['types']; } $role = trim((string)($q['role_filter'] ?? '')); if ($role !== '') { diff --git a/app/Models/AuthorRepository.php b/app/Models/AuthorRepository.php index 98fad3646..36f898e06 100644 --- a/app/Models/AuthorRepository.php +++ b/app/Models/AuthorRepository.php @@ -137,6 +137,9 @@ public function create(array $data): int // Decode HTML entities to prevent double encoding $nome = \App\Support\HtmlHelper::decode($data['nome']); + // Quotes typed around a new name mean "exact spelling" (#501); they + // are never part of the stored name. + $nome = \App\Support\ExactSearch::quotedValue($nome) ?? $nome; $pseudonimo = \App\Support\HtmlHelper::decode($data['pseudonimo'] ?? ''); $nazionalita = \App\Support\HtmlHelper::decode($data['nazionalita'] ?? ''); $biografia = \App\Support\HtmlHelper::decode($data['biografia'] ?? ''); @@ -213,7 +216,12 @@ public function update(int $id, array $data): bool $sito_web = \App\Support\HtmlHelper::decode($data['sito_web'] ?? ''); // Normalize author name to canonical format ("Name Surname") - // This ensures consistency when updating existing authors + // This ensures consistency when updating existing authors. Quotes + // around the whole name are never stored, as in create() (#501). + // One record holds one name: normalizeStored() would split a '|' or + // ';' in it as a cache-column list, so the edit form would store + // another name than create() does. + $nome = \App\Support\ExactSearch::quotedValue($nome) ?? $nome; $nome = \App\Support\AuthorNormalizer::normalize($nome); // Base columns always present. @@ -300,6 +308,26 @@ public function findByName(string $name): ?int * @param string $name Author name in any format * @return int|null Author ID if found, null otherwise */ + /** + * Author written exactly like $name (accents distinct, case ignored), as + * typed or in canonical "Name Surname" form; null when there is none. + */ + private function findByExactName(string $name): ?int + { + foreach (array_unique([$name, \App\Support\AuthorNormalizer::normalize($name)]) as $candidate) { + $match = \App\Support\ExactSearch::equalsCondition('nome', $candidate); + $stmt = $this->db->prepare("SELECT id FROM autori WHERE {$match['sql']} ORDER BY id LIMIT 1"); + $stmt->bind_param($match['types'], ...$match['params']); + $stmt->execute(); + $row = $stmt->get_result()->fetch_assoc(); + $stmt->close(); + if ($row) { + return (int) $row['id']; + } + } + return null; + } + public function findByCanonicalName(string $name): ?int { $name = trim($name); @@ -307,12 +335,26 @@ public function findByCanonicalName(string $name): ?int return null; } + // A name typed in quotes asks for that exact spelling (#501): only an + // author written the same way (accents included, case ignored) is + // reused, and the accent-tolerant steps below are skipped, so + // "Häffner" in quotes becomes a new author when only Haffner exists. + $quoted = \App\Support\ExactSearch::quotedValue($name); + if ($quoted !== null) { + return $this->findByExactName($quoted); + } + // Normalize the input name first (this is the key fix!) $normalizedInput = \App\Support\AuthorNormalizer::normalize($name); + // The collation folds accents, so `nome = ?` also admits "Haffner" + // for "Häffner". When both are on file the exact spelling must win + // (#501): order the byte-identical row first in every equality step. + $exactFirst = \App\Support\ExactSearch::exactFirstSql('nome'); + // First try exact match with normalized name - $stmt = $this->db->prepare("SELECT id FROM autori WHERE nome = ? LIMIT 1"); - $stmt->bind_param('s', $normalizedInput); + $stmt = $this->db->prepare("SELECT id FROM autori WHERE nome = ? ORDER BY {$exactFirst}, id LIMIT 1"); + $stmt->bind_param('ss', $normalizedInput, $normalizedInput); $stmt->execute(); $res = $stmt->get_result(); $row = $res->fetch_assoc(); @@ -323,8 +365,8 @@ public function findByCanonicalName(string $name): ?int // Also try the original name (in case DB has unnormalized entries) if ($normalizedInput !== $name) { - $stmt = $this->db->prepare("SELECT id FROM autori WHERE nome = ? LIMIT 1"); - $stmt->bind_param('s', $name); + $stmt = $this->db->prepare("SELECT id FROM autori WHERE nome = ? ORDER BY {$exactFirst}, id LIMIT 1"); + $stmt->bind_param('ss', $name, $name); $stmt->execute(); $res = $stmt->get_result(); $row = $res->fetch_assoc(); @@ -336,8 +378,8 @@ public function findByCanonicalName(string $name): ?int // Try case-insensitive match with normalized name $lowerNormalized = mb_strtolower($normalizedInput, 'UTF-8'); - $stmt = $this->db->prepare("SELECT id FROM autori WHERE LOWER(nome) = ? LIMIT 1"); - $stmt->bind_param('s', $lowerNormalized); + $stmt = $this->db->prepare("SELECT id FROM autori WHERE LOWER(nome) = ? ORDER BY (LOWER(nome) COLLATE utf8mb4_bin = ?) DESC, id LIMIT 1"); + $stmt->bind_param('ss', $lowerNormalized, $lowerNormalized); $stmt->execute(); $res = $stmt->get_result(); $row = $res->fetch_assoc(); diff --git a/app/Models/BookRepository.php b/app/Models/BookRepository.php index 0313350ee..aae1012e0 100644 --- a/app/Models/BookRepository.php +++ b/app/Models/BookRepository.php @@ -517,17 +517,17 @@ public function createBasic(array $data): int if ($this->hasColumn('traduttore') && array_key_exists('traduttore', $data)) { $val = $data['traduttore'] ?? null; $val = is_string($val) ? trim($val) : null; - $addField('traduttore', 's', $val !== null && $val !== '' ? \App\Support\AuthorNormalizer::normalize($val) : null); + $addField('traduttore', 's', $val !== null && $val !== '' ? \App\Support\AuthorNormalizer::normalizeStored($val) : null); } if ($this->hasColumn('illustratore') && array_key_exists('illustratore', $data)) { $val = $data['illustratore'] ?? null; $val = is_string($val) ? trim($val) : null; - $addField('illustratore', 's', $val !== null && $val !== '' ? \App\Support\AuthorNormalizer::normalize($val) : null); + $addField('illustratore', 's', $val !== null && $val !== '' ? \App\Support\AuthorNormalizer::normalizeStored($val) : null); } if ($this->hasColumn('curatore') && array_key_exists('curatore', $data)) { $val = $data['curatore'] ?? null; $val = is_string($val) ? trim($val) : null; - $addField('curatore', 's', $val !== null && $val !== '' ? \App\Support\AuthorNormalizer::normalize($val) : null); + $addField('curatore', 's', $val !== null && $val !== '' ? \App\Support\AuthorNormalizer::normalizeStored($val) : null); } if ($this->hasColumn('numero_pagine')) { $numPagineRaw = $data['numero_pagine'] ?? null; @@ -881,17 +881,17 @@ public function updateBasic(int $id, array $data): bool if ($this->hasColumn('traduttore') && array_key_exists('traduttore', $data)) { $val = $data['traduttore'] ?? null; $val = is_string($val) ? trim($val) : null; - $addSet('traduttore', 's', $val !== null && $val !== '' ? \App\Support\AuthorNormalizer::normalize($val) : null); + $addSet('traduttore', 's', $val !== null && $val !== '' ? \App\Support\AuthorNormalizer::normalizeStored($val) : null); } if ($this->hasColumn('illustratore') && array_key_exists('illustratore', $data)) { $val = $data['illustratore'] ?? null; $val = is_string($val) ? trim($val) : null; - $addSet('illustratore', 's', $val !== null && $val !== '' ? \App\Support\AuthorNormalizer::normalize($val) : null); + $addSet('illustratore', 's', $val !== null && $val !== '' ? \App\Support\AuthorNormalizer::normalizeStored($val) : null); } if ($this->hasColumn('curatore') && array_key_exists('curatore', $data)) { $val = $data['curatore'] ?? null; $val = is_string($val) ? trim($val) : null; - $addSet('curatore', 's', $val !== null && $val !== '' ? \App\Support\AuthorNormalizer::normalize($val) : null); + $addSet('curatore', 's', $val !== null && $val !== '' ? \App\Support\AuthorNormalizer::normalizeStored($val) : null); } if ($this->hasColumn('numero_pagine')) { $numPagineRaw = $data['numero_pagine'] ?? null; @@ -1656,7 +1656,10 @@ public function updateOptionals(int $bookId, array $data): void if (!is_string($data[$c])) { continue; } $cols[$c] = $this->normalizeEnumValue((string) $data[$c], 'tipo_media', 'libro'); } elseif (in_array($c, ['traduttore', 'illustratore', 'curatore'], true)) { - $cols[$c] = \App\Support\AuthorNormalizer::normalize((string) $data[$c]); + // The text column is a display cache: a name typed in quotes + // (exact spelling, #501) was already resolved to its entity + // by the controller; the quotes are not part of the name. + $cols[$c] = \App\Support\AuthorNormalizer::normalizeStored((string) $data[$c]); } elseif ($c === 'luogo_pubblicazione') { // Same rule as create()/update(): trimmed, and a blank // value is not written (it would overwrite their NULL). @@ -1714,13 +1717,13 @@ public function updateOptionals(int $bookId, array $data): void if ($this->hasColumn('traduttore') && !$traduttoreProvided && !array_key_exists('traduttori_ids', $data) && !empty($data['scraped_translator'])) { - $cols['traduttore'] = \App\Support\AuthorNormalizer::normalize((string) $data['scraped_translator']); + $cols['traduttore'] = \App\Support\AuthorNormalizer::normalizeStored((string) $data['scraped_translator']); } $illustratoreProvided = array_key_exists('illustratore', $data) && $data['illustratore'] !== '' && $data['illustratore'] !== null; if ($this->hasColumn('illustratore') && !$illustratoreProvided && !array_key_exists('illustratori_ids', $data) && !empty($data['scraped_illustrator'])) { - $cols['illustratore'] = \App\Support\AuthorNormalizer::normalize((string) $data['scraped_illustrator']); + $cols['illustratore'] = \App\Support\AuthorNormalizer::normalizeStored((string) $data['scraped_illustrator']); } if ($this->hasColumn('tipo_media') && !array_key_exists('tipo_media', $cols)) { $formato = trim((string) ($data['formato'] ?? ($data['scraped_formato'] ?? ''))); diff --git a/app/Models/PublisherRepository.php b/app/Models/PublisherRepository.php index 9d37cb224..8402bdfb9 100644 --- a/app/Models/PublisherRepository.php +++ b/app/Models/PublisherRepository.php @@ -143,6 +143,8 @@ public function create(array $data): int // Decode HTML entities to prevent double encoding $nome = \App\Support\HtmlHelper::decode($data['nome']); + // Quotes typed around a new name mean "exact spelling" (#501). + $nome = \App\Support\ExactSearch::quotedValue($nome) ?? $nome; $sito_web = \App\Support\HtmlHelper::decode($data['sito_web'] ?? ''); $indirizzo = \App\Support\HtmlHelper::decode($data['indirizzo'] ?? ''); $telefono = \App\Support\HtmlHelper::decode($data['telefono'] ?? ''); @@ -182,6 +184,8 @@ public function update(int $id, array $data): bool // Decode HTML entities to prevent double encoding $nome = \App\Support\HtmlHelper::decode($data['nome']); + // Quotes around the whole name are never stored, as in create() (#501). + $nome = \App\Support\ExactSearch::quotedValue($nome) ?? $nome; $sito_web = \App\Support\HtmlHelper::decode($data['sito_web'] ?? ''); $indirizzo = \App\Support\HtmlHelper::decode($data['indirizzo'] ?? ''); $telefono = \App\Support\HtmlHelper::decode($data['telefono'] ?? ''); @@ -283,8 +287,21 @@ public function findByName(string $name): ?int { $name = trim($name); if ($name === '') return null; - $stmt = $this->db->prepare('SELECT id FROM editori WHERE nome = ? LIMIT 1'); - $stmt->bind_param('s', $name); + // Typed in quotes: only that exact spelling (accents included, case + // ignored) is reused, so a new "Häffner" is not merged into Haffner. + $quoted = \App\Support\ExactSearch::quotedValue($name); + if ($quoted !== null) { + $match = \App\Support\ExactSearch::equalsCondition('nome', $quoted); + $stmt = $this->db->prepare("SELECT id FROM editori WHERE {$match['sql']} ORDER BY id LIMIT 1"); + $stmt->bind_param($match['types'], ...$match['params']); + $stmt->execute(); + $stmt->bind_result($id); + return $stmt->fetch() ? (int) $id : null; + } + // The collation folds accents, so "Häffner" also matches "Haffner"; + // when both are on file the exact spelling wins (#501). + $stmt = $this->db->prepare('SELECT id FROM editori WHERE nome = ? ORDER BY ' . \App\Support\ExactSearch::exactFirstSql('nome') . ', id LIMIT 1'); + $stmt->bind_param('ss', $name, $name); $stmt->execute(); $stmt->bind_result($id); if ($stmt->fetch()) { return (int)$id; } diff --git a/app/Services/BulkEnrichmentService.php b/app/Services/BulkEnrichmentService.php index fede3b7f4..1cce05885 100644 --- a/app/Services/BulkEnrichmentService.php +++ b/app/Services/BulkEnrichmentService.php @@ -695,12 +695,13 @@ private function findOrCreatePublisher(string $name): ?int } // Try to find existing publisher - $stmt = $this->db->prepare("SELECT id FROM editori WHERE nome = ? LIMIT 1"); + // Exact spelling first when the collation also admits "Haffner" for "Häffner" (#501). + $stmt = $this->db->prepare("SELECT id FROM editori WHERE nome = ? ORDER BY " . \App\Support\ExactSearch::exactFirstSql('nome') . ", id LIMIT 1"); if ($stmt === false) { return null; } - $stmt->bind_param('s', $name); + $stmt->bind_param('ss', $name, $name); $stmt->execute(); $result = $stmt->get_result(); $row = $result->fetch_assoc(); @@ -792,12 +793,13 @@ private function findOrCreateAuthor(string $name): ?int } // Try to find existing author - $stmt = $this->db->prepare("SELECT id FROM autori WHERE nome = ? LIMIT 1"); + // Exact spelling first when the collation also admits "Haffner" for "Häffner" (#501). + $stmt = $this->db->prepare("SELECT id FROM autori WHERE nome = ? ORDER BY " . \App\Support\ExactSearch::exactFirstSql('nome') . ", id LIMIT 1"); if ($stmt === false) { return null; } - $stmt->bind_param('s', $name); + $stmt->bind_param('ss', $name, $name); $stmt->execute(); $result = $stmt->get_result(); $row = $result->fetch_assoc(); diff --git a/app/Services/UnifiedCatalogService.php b/app/Services/UnifiedCatalogService.php index 6f74bbb57..8c60c4bd9 100644 --- a/app/Services/UnifiedCatalogService.php +++ b/app/Services/UnifiedCatalogService.php @@ -180,13 +180,39 @@ private function articleQuery(array $filters): ?array if ($term !== '') { // Same word-wise semantics as the book index; punctuation in an // inverted personal name must not prevent a natural-order search. - $words = preg_split('/[^\p{L}\p{N}_%]+/u', mb_substr($term, 0, 200), -1, PREG_SPLIT_NO_EMPTY) ?: []; - foreach (array_slice($words, 0, 20) as $word) { - $textMatch = "CONCAT_WS(' ', c.titolo, c.sottotitolo, c.autori, c.contenitore_titolo, c.keywords, c.abstract, c.issn) LIKE ? ESCAPE '='"; - $pattern = '%' . strtr($word, ['=' => '==', '%' => '=%', '_' => '=_']) . '%'; + // A quoted group is one exact term (#501), like in the book search, + // so articles by "Häffner" do not answer "haffner" in quotes. + $terms = []; + $tokens = \App\Support\ExactSearch::tokenize(mb_substr($term, 0, 200)); + foreach ($tokens as $token) { + if ($token['exact']) { + $terms[] = $token; + continue; + } + foreach (preg_split('/[^\p{L}\p{N}_%]+/u', $token['term'], -1, PREG_SPLIT_NO_EMPTY) ?: [] as $word) { + $terms[] = ['term' => $word, 'exact' => false]; + } + } + if ($tokens !== [] && $terms === []) { + // Only punctuation was typed ("!!!", a garbled "??"): the book + // search looks for it literally and finds nothing, so the + // articles must not answer with the whole collection. + $where[] = '1=0'; + } + $articleText = "CONCAT_WS(' ', c.titolo, c.sottotitolo, c.autori, c.contenitore_titolo, c.keywords, c.abstract, c.issn)"; + foreach (array_slice($terms, 0, 20) as ['term' => $word, 'exact' => $exact]) { + if ($exact) { + $textMatch = \App\Support\ExactSearch::likeSql($articleText, true); + $authorMatch = \App\Support\ExactSearch::likeSql("CONCAT_WS(' ',a.nome,a.pseudonimo)", true); + $pattern = \App\Support\ExactSearch::likePattern($word); + } else { + $textMatch = "$articleText LIKE ? ESCAPE '='"; + $authorMatch = "CONCAT_WS(' ',a.nome,a.pseudonimo) LIKE ? ESCAPE '='"; + $pattern = '%' . strtr($word, ['=' => '==', '%' => '=%', '_' => '=_']) . '%'; + } $params[] = $pattern; if ($linkedAuthors) { - $textMatch = "($textMatch OR EXISTS (SELECT 1 FROM emeroteca_contributi_autori ca JOIN autori a ON a.id=ca.autore_id WHERE ca.contributo_id=c.id AND CONCAT_WS(' ',a.nome,a.pseudonimo) LIKE ? ESCAPE '='))"; + $textMatch = "($textMatch OR EXISTS (SELECT 1 FROM emeroteca_contributi_autori ca JOIN autori a ON a.id=ca.autore_id WHERE ca.contributo_id=c.id AND $authorMatch))"; $params[] = $pattern; } $where[] = $textMatch; diff --git a/app/Support/AuthorNormalizer.php b/app/Support/AuthorNormalizer.php index 8ec86d8ba..85b74cf38 100644 --- a/app/Support/AuthorNormalizer.php +++ b/app/Support/AuthorNormalizer.php @@ -15,6 +15,38 @@ */ class AuthorNormalizer { + /** + * The form of a contributor name that is WRITTEN to a text column + * (traduttore, illustratore, curatore, a renamed author or publisher). + * Quotes typed around the whole name mean "exact spelling" (#501) and are + * a lookup instruction, never part of the stored name, exactly as when an + * author record is created. + */ + public static function normalizeStored(string $name): string + { + // A cache column holds a '; '-joined list (the separator ContributorSync + // and the importers use, '|' accepted on input). Each name is + // normalised on its own: run as one string, the comma rule turned + // "Rossi, Mario; Bianchi, Luca" into "Mario; Bianchi, Luca Rossi" and + // the quotes of one listed name were never removed. + // Decoded first, as ContributorSync::splitNames() does: the ';' of an + // HTML entity (O'Brien) is not a list separator. + if (preg_match('/[;|]/u', HtmlHelper::decode($name)) === 1) { + $names = []; + foreach (ContributorSync::splitNames($name) as $part) { + $part = self::normalize(ExactSearch::quotedValue($part) ?? $part); + if ($part !== '' && !in_array($part, $names, true)) { + $names[] = $part; + } + } + return implode('; ', $names); + } + // A single name is decoded too, so it is cached the way the same + // name inside a list is (O'Brien → O'Brien). + $name = HtmlHelper::decode($name); + return self::normalize(ExactSearch::quotedValue($name) ?? $name); + } + /** * Normalize an author name to a canonical format: "Name Surname" * @@ -24,11 +56,24 @@ class AuthorNormalizer * - "Marx, Karl Heinrich" → "Karl Heinrich Marx" * - "De Filippo, Eduardo" → "Eduardo De Filippo" * + * A name typed wholly in quotes (`"Häffner, Rolf"`) means "this exact + * spelling" (#501): the quotes are kept, around the canonical form + * (`"Rolf Häffner"`), so the save and lookup paths still see a whole-value + * quoted string (ExactSearch::quotedValue()) and the person is the one + * written that way. Without this the quotes ended up inside the swapped + * name (`Rolf" "Häffner`) and were stored as part of it. + * * @param string $name The author name in any format * @return string Normalized name in "Name Surname" format */ public static function normalize(string $name): string { + $quoted = ExactSearch::quotedValue($name); + if ($quoted !== null) { + $inner = self::normalize($quoted); + return $inner === '' ? '' : '"' . $inner . '"'; + } + $name = trim($name); if ($name === '') { @@ -78,8 +123,9 @@ public static function normalize(string $name): string */ public static function toSearchForm(string $name): string { - // First normalize the name - $normalized = self::normalize($name); + // First normalize the name. Quotes are a lookup instruction, never + // part of the name: a quoted candidate compares on the name inside. + $normalized = self::normalize(ExactSearch::quotedValue($name) ?? $name); if ($normalized === '') { return ''; @@ -108,7 +154,7 @@ public static function toSearchForm(string $name): string */ public static function getSearchVariants(string $name): array { - $normalized = self::normalize($name); + $normalized = self::normalize(ExactSearch::quotedValue($name) ?? $name); if ($normalized === '') { return []; diff --git a/app/Support/ExactSearch.php b/app/Support/ExactSearch.php new file mode 100644 index 000000000..d9d698bb4 --- /dev/null +++ b/app/Support/ExactSearch.php @@ -0,0 +1,312 @@ + + */ + public static function tokenize(string $query): array + { + $query = self::protectInchMarks(self::scrub($query)); + $q = '[' . preg_quote(self::QUOTES, '/') . ']'; + $parts = preg_split('/(' . $q . '[^' . preg_quote(self::QUOTES, '/') . ']*(?:' . $q . '|$))/u', $query, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY); + if ($parts === false) { + $parts = [$query]; + } + + $terms = []; + foreach ($parts as $part) { + if (preg_match('/^' . $q . '/u', $part) === 1) { + $inner = self::collapse(self::stripQuotes($part)); + if ($inner !== '') { + $terms[] = ['term' => $inner, 'exact' => true]; + } + continue; + } + foreach (preg_split('/\s+/u', $part, -1, PREG_SPLIT_NO_EMPTY) ?: [] as $word) { + $terms[] = ['term' => self::restoreInchMarks($word), 'exact' => false]; + } + } + return $terms; + } + + /** + * Parse a single-value column filter (admin list "Name" box) into ONE + * term, for callers that can only bind one pattern (prefix ordering, + * in-PHP matching). The value is exact only when it is quoted as a + * whole: every token is a quoted group (`"Häffner"`, `"Thomas" "Mann"`, + * the groups joined into one phrase). A value that mixes quoted and + * unquoted words (`"häffner" rolf`) is not one exact phrase: it comes + * back tolerant, with the quotes dropped so they are never searched as + * literal characters. Callers that can bind one condition per word use + * filterCondition(), which keeps each word's own rule. + * + * @return array{term: string, exact: bool} + */ + public static function parseFilter(string $value): array + { + $value = trim(self::scrub($value)); + $tokens = self::tokenize($value); + if ($tokens === []) { + // Only quotes (or nothing): no term, so no filter. + return ['term' => self::hasQuote($value) ? '' : $value, 'exact' => self::hasQuote($value)]; + } + if (!self::hasQuote($value)) { + return ['term' => $value, 'exact' => false]; + } + $words = self::collapse(implode(' ', array_column($tokens, 'term'))); + $wholeQuoted = !in_array(false, array_column($tokens, 'exact'), true); + return ['term' => $words, 'exact' => $wholeQuoted]; + } + + /** + * The name inside a value typed wholly in quotes (`"Rolf Häffner"`), or + * null otherwise. Used where a name is SAVED rather than searched: quotes + * there mean "this exact spelling is a different person/publisher", and + * they are never part of the stored name. A name that only contains a + * quoted part (`"Il Mulino", Bologna`, `"Pippo" Inzaghi`) is not quoted + * as a whole and is kept exactly as typed. + */ + public static function quotedValue(string $value): ?string + { + ['term' => $term, 'exact' => $exact] = self::parseFilter($value); + return $exact && $term !== '' ? $term : null; + } + + /** + * WHERE fragment for "$expr is exactly $value": accents distinct, case + * ignored. For lookups by a name taken from a link (author page, publisher + * filter), where the collation would otherwise treat `Haffner` and + * `Häffner` as the same name. The plain `=` stays first so an index on + * $expr still narrows the rows; the binary comparison then drops the + * accent-folded matches. + * + * @return array{sql: string, params: list, types: string} + */ + public static function equalsCondition(string $expr, string $value): array + { + return [ + 'sql' => "({$expr} = ? AND LOWER({$expr}) COLLATE utf8mb4_bin = LOWER(?))", + 'params' => [$value, $value], + 'types' => 'ss', + ]; + } + + /** + * Same as equalsCondition() for a list of accepted values (IN). + * + * @param list $values + * @return array{sql: string, params: list, types: string}|null + */ + public static function inCondition(string $expr, array $values): ?array + { + if ($values === []) { + return null; + } + $plain = implode(',', array_fill(0, count($values), '?')); + $lowered = implode(',', array_fill(0, count($values), 'LOWER(?)')); + return [ + 'sql' => "({$expr} IN ({$plain}) AND LOWER({$expr}) COLLATE utf8mb4_bin IN ({$lowered}))", + 'params' => array_merge($values, $values), + 'types' => str_repeat('s', 2 * count($values)), + ]; + } + + /** + * ORDER BY fragment that puts the exact spelling (accents included, case + * ignored) first among rows an accent-folding `$expr = ?` admitted. Bind + * the same value again. Used by find-by-name lookups so an existing + * `Häffner` wins over `Haffner` when both are on file, also when the + * incoming name differs only in case. + */ + public static function exactFirstSql(string $expr): string + { + return "(LOWER({$expr}) COLLATE utf8mb4_bin = LOWER(?)) DESC"; + } + + /** + * WHERE fragment for a single-value filter matched against any of $exprs + * (OR), honouring quotes via parseFilter(). Null when nothing is left to + * match (e.g. the value was only a quote). + * + * A box with more than one term is not one phrase: every term must + * match, each with its own rule, as in wordsCondition() and the main + * search box. That covers mixed words (`archivio "haffner"`) and several + * quoted groups alike: `"Thomas" "Mann"` is two exact words in any + * order, exactly as in the book search, and `"Thomas Mann"` is the + * phrase. parseFilter() joins the groups only for callers that can bind + * a single pattern. + * + * @param list $exprs + * @return array{sql: string, params: list, types: string}|null + */ + public static function filterCondition(array $exprs, string $value): ?array + { + $tokens = self::tokenize($value); + if (count($tokens) > 1 && in_array(true, array_column($tokens, 'exact'), true)) { + // Same budget as the other word searches: a pasted wall of words + // must not turn into thousands of placeholders. + return self::wordsCondition($exprs, $value, self::MAX_FILTER_TERMS); + } + ['term' => $term, 'exact' => $exact] = self::parseFilter($value); + if ($term === '' || $exprs === []) { + return null; + } + $sql = []; + $params = []; + foreach ($exprs as $expr) { + $sql[] = self::likeSql($expr, $exact); + $params[] = self::likePattern($term); + } + return [ + 'sql' => '(' . implode(' OR ', $sql) . ')', + 'params' => $params, + 'types' => str_repeat('s', count($params)), + ]; + } + + /** + * WHERE fragment for a multi-word query: every term (see tokenize()) must + * match at least one of $exprs. Null when the query has no usable term. + * + * @param list $exprs + * @return array{sql: string, params: list, types: string}|null + */ + public static function wordsCondition(array $exprs, string $query, ?int $maxTerms = null): ?array + { + $sql = []; + $params = []; + $terms = self::tokenize($query); + if ($maxTerms !== null) { + $terms = array_slice($terms, 0, max(0, $maxTerms)); + } + foreach ($terms as ['term' => $term, 'exact' => $exact]) { + $or = []; + foreach ($exprs as $expr) { + $or[] = self::likeSql($expr, $exact); + $params[] = self::likePattern($term); + } + $sql[] = '(' . implode(' OR ', $or) . ')'; + } + if ($sql === [] || $exprs === []) { + return null; + } + return [ + 'sql' => '(' . implode(' AND ', $sql) . ')', + 'params' => $params, + 'types' => str_repeat('s', count($params)), + ]; + } + + /** + * SQL for "$expr contains the bound pattern". Bind likePattern($term). + */ + public static function likeSql(string $expr, bool $exact): string + { + return $exact + ? "LOWER({$expr}) COLLATE utf8mb4_bin LIKE LOWER(?) ESCAPE '\\\\'" + : "{$expr} LIKE ? ESCAPE '\\\\'"; + } + + /** `%term%` with LIKE metacharacters escaped (backslash is the ESCAPE char). */ + public static function likePattern(string $term): string + { + return '%' . str_replace(['\\', '%', '_'], ['\\\\', '\\%', '\\_'], $term) . '%'; + } + + /** + * Replace invalid UTF-8 so the /u regexes cannot fail. A failed split + * would yield no term at all, and "no term" means "no filter": a garbled + * query would then list the whole catalogue instead of nothing. + */ + private static function scrub(string $value): string + { + return mb_check_encoding($value, 'UTF-8') ? $value : mb_scrub($value, 'UTF-8'); + } + + private static function hasQuote(string $value): bool + { + return preg_match('/[' . preg_quote(self::QUOTES, '/') . ']/u', self::protectInchMarks($value)) === 1; + } + + /** + * A straight or closing double quote right after a digit, outside any + * quoted group, is an inch mark (`5" floppy`, `24" monitor`), not the start + * of an exact group: it is swapped for a private-use placeholder so the + * tokenizer keeps it as a literal character. Inside a group the same + * character still closes it (`"1984"`). + */ + private static function protectInchMarks(string $value): string + { + if (!str_contains($value, '"') && !str_contains($value, '”')) { + return $value; + } + $chars = preg_split('//u', $value, -1, PREG_SPLIT_NO_EMPTY) ?: []; + $open = false; + $prev = ''; + foreach ($chars as $i => $char) { + if (str_contains(self::QUOTES, $char)) { + if (!$open && ($char === '"' || $char === '”') && preg_match('/^\d$/u', $prev) === 1) { + $chars[$i] = self::INCH_PLACEHOLDER; + } else { + $open = !$open; + } + } + $prev = $chars[$i]; + } + return implode('', $chars); + } + + private static function restoreInchMarks(string $value): string + { + return str_replace(self::INCH_PLACEHOLDER, '"', $value); + } + + private static function stripQuotes(string $value): string + { + $q = preg_quote(self::QUOTES, '/'); + return (string) preg_replace('/^[' . $q . ']+|[' . $q . ']+$/u', '', trim($value)); + } + + private static function collapse(string $value): string + { + return trim((string) preg_replace('/\s+/u', ' ', $value)); + } +} diff --git a/app/Support/SearchIndexBuilder.php b/app/Support/SearchIndexBuilder.php index 1dd41d786..aa90ea3c8 100644 --- a/app/Support/SearchIndexBuilder.php +++ b/app/Support/SearchIndexBuilder.php @@ -286,6 +286,10 @@ public static function rebuildMany(\mysqli $db, array $bookIds): void * match somewhere" behaviour without letting unindexable required terms zero * out otherwise valid results. * + * The column collation folds accents (`haffner` finds `Häffner`). A quoted + * group (`"haffner"`, `"thomas mann"`, unclosed quote = closed) is matched + * with its exact spelling and as a phrase instead — see ExactSearch (#501). + * * UPGRADE-WINDOW SAFETY: when the `search_index` column does not exist yet * (new PHP deployed but the admin has not run the 0.7.31 DB migration), * MATCH/LIKE on it would 500 every catalog search + autocomplete/preview @@ -311,16 +315,27 @@ public static function buildSearchCondition(\mysqli $db, string $column, string return self::buildLegacyCondition($db, $column, $searchQuery); } - $words = preg_split('/\s+/', $searchQuery, -1, PREG_SPLIT_NO_EMPTY) ?: []; - $booleanTerms = []; $parts = []; $params = []; $types = ''; - foreach ($words as $word) { - $wordBase = self::normalizeSearchWord($word); - if ($wordBase === '') { + foreach (self::searchTerms($searchQuery) as ['term' => $wordBase, 'exact' => $exact]) { + if ($exact) { + // Quoted term (#501): FULLTEXT still narrows the rows — every + // indexable word must start a word, accent-folded, the same + // prefix rule an unquoted word follows — and the binary-collation + // LIKE then keeps only the exact spelling/phrase. Without the + // `*`, "haff" would demand the whole word "haff" and find + // nothing while the autocomplete above it lists Haffner. + foreach (self::fulltextTokens($wordBase) as $token) { + if (self::fulltextTermForWord($token) !== null) { + $booleanTerms[] = '+' . $token . '*'; + } + } + $parts[] = ExactSearch::likeSql($column, true); + $params[] = self::likePattern($wordBase); + $types .= 's'; continue; } $fulltextTerm = self::fulltextTermForWord($wordBase); @@ -369,39 +384,50 @@ private static function buildLegacyCondition(\mysqli $db, string $column, string $prefix = $dot === false ? '' : substr($column, 0, $dot + 1); $descExpr = self::descriptionExpr($db, $prefix); - $words = preg_split('/\s+/', $searchQuery, -1, PREG_SPLIT_NO_EMPTY) ?: []; - $parts = []; $params = []; $types = ''; $hasJunction = SchemaInfo::hasLibriEditori($db); - foreach ($words as $word) { - $wordBase = self::normalizeSearchWord($word); - if ($wordBase === '') { - continue; - } + foreach (self::searchTerms($searchQuery) as ['term' => $wordBase, 'exact' => $exact]) { $like = self::likePattern($wordBase); + // A quoted term must also START a word, as on the FULLTEXT path + // (`+token*`): "haffner" in quotes must not answer for Schaffner. + // The exact LIKE keeps the spelling, the REGEXP the word start; + // both compare the lowered value under the binary collation. + // `_` is a word character for the InnoDB FULLTEXT parser too, so + // "haffner" must not start a word after it (x_haffner). + $wordStart = '(^|[^[:alnum:]_])' . preg_quote(mb_strtolower($wordBase, 'UTF-8')); + $exprCount = 0; + $m = static function (string $expr) use ($exact, &$exprCount): string { + $exprCount++; + return $exact + ? '(' . ExactSearch::likeSql($expr, true) . " AND LOWER({$expr}) COLLATE utf8mb4_bin REGEXP ?)" + : ExactSearch::likeSql($expr, false); + }; $bookIdExpr = $prefix . 'id'; $publisherIdExpr = $prefix . 'editore_id'; - $parts[] = "({$prefix}titolo LIKE ? ESCAPE '\\\\'" - . " OR {$prefix}sottotitolo LIKE ? ESCAPE '\\\\'" - . " OR {$descExpr} LIKE ? ESCAPE '\\\\'" - . " OR {$prefix}parole_chiave LIKE ? ESCAPE '\\\\'" - . " OR {$prefix}isbn10 LIKE ? ESCAPE '\\\\'" - . " OR {$prefix}isbn13 LIKE ? ESCAPE '\\\\'" - . " OR {$prefix}ean LIKE ? ESCAPE '\\\\'" - . " OR EXISTS (SELECT 1 FROM libri_autori la JOIN autori a ON la.autore_id = a.id WHERE la.libro_id = {$bookIdExpr} AND CONCAT_WS(' ', a.nome, a.pseudonimo) LIKE ? ESCAPE '\\\\')" - . " OR EXISTS (SELECT 1 FROM editori e WHERE e.id = {$publisherIdExpr} AND e.nome LIKE ? ESCAPE '\\\\')" + $parts[] = '(' . $m("{$prefix}titolo") + . ' OR ' . $m("{$prefix}sottotitolo") + . ' OR ' . $m($descExpr) + . ' OR ' . $m("{$prefix}parole_chiave") + . ' OR ' . $m("{$prefix}isbn10") + . ' OR ' . $m("{$prefix}isbn13") + . ' OR ' . $m("{$prefix}ean") + . " OR EXISTS (SELECT 1 FROM libri_autori la JOIN autori a ON la.autore_id = a.id WHERE la.libro_id = {$bookIdExpr} AND " . $m("CONCAT_WS(' ', a.nome, a.pseudonimo)") . ')' + . " OR EXISTS (SELECT 1 FROM editori e WHERE e.id = {$publisherIdExpr} AND " . $m('e.nome') . ')' . ($hasJunction - ? " OR EXISTS (SELECT 1 FROM libri_editori le JOIN editori e2 ON e2.id = le.editore_id WHERE le.libro_id = {$bookIdExpr} AND e2.nome LIKE ? ESCAPE '\\\\')" + ? " OR EXISTS (SELECT 1 FROM libri_editori le JOIN editori e2 ON e2.id = le.editore_id WHERE le.libro_id = {$bookIdExpr} AND " . $m('e2.nome') . ')' : '') . ')'; - $paramsPerWord = $hasJunction ? 10 : 9; - for ($i = 0; $i < $paramsPerWord; $i++) { + for ($i = 0; $i < $exprCount; $i++) { $params[] = $like; $types .= 's'; + if ($exact) { + $params[] = $wordStart; + $types .= 's'; + } } } @@ -444,14 +470,7 @@ public static function buildRelevanceOrder( ?int $maxWords = null ): array { - $rawWords = preg_split('/\s+/', trim($searchQuery), -1, PREG_SPLIT_NO_EMPTY) ?: []; - $words = []; - foreach ($rawWords as $word) { - $wordBase = self::normalizeSearchWord($word); - if ($wordBase !== '') { - $words[] = $wordBase; - } - } + $words = self::searchTerms($searchQuery); if ($maxWords !== null) { $words = array_slice($words, 0, max(0, $maxWords)); } @@ -468,18 +487,21 @@ public static function buildRelevanceOrder( $params = []; $types = ''; - foreach ($words as $word) { + foreach ($words as ['term' => $word, 'exact' => $exact]) { $like = self::likePattern($word); + // A quoted term (#501) scores only on its exact spelling, matching + // the rows buildSearchCondition admitted. + $m = static fn(string $expr): string => ExactSearch::likeSql($expr, $exact); - $terms[] = "(CASE WHEN ({$prefix}isbn10 LIKE ? ESCAPE '\\\\'" - . " OR {$prefix}isbn13 LIKE ? ESCAPE '\\\\'" - . " OR {$prefix}ean LIKE ? ESCAPE '\\\\') THEN 120 ELSE 0 END)"; + $terms[] = '(CASE WHEN (' . $m("{$prefix}isbn10") + . ' OR ' . $m("{$prefix}isbn13") + . ' OR ' . $m("{$prefix}ean") . ') THEN 120 ELSE 0 END)'; $params[] = $like; $params[] = $like; $params[] = $like; $types .= 'sss'; - $terms[] = "(CASE WHEN {$titleExpr} LIKE ? ESCAPE '\\\\' THEN 100 ELSE 0 END)"; + $terms[] = "(CASE WHEN " . $m($titleExpr) . " THEN 100 ELSE 0 END)"; $params[] = $like; $types .= 's'; @@ -487,25 +509,25 @@ public static function buildRelevanceOrder( $terms[] = "(CASE WHEN EXISTS (SELECT 1 FROM libri_autori la_rel" . " JOIN autori a_rel ON a_rel.id = la_rel.autore_id" . " WHERE la_rel.libro_id = {$prefix}id" - . " AND {$authorExpr} LIKE ? ESCAPE '\\\\') THEN 60 ELSE 0 END)"; + . " AND " . $m($authorExpr) . ") THEN 60 ELSE 0 END)"; $params[] = $like; $types .= 's'; - $terms[] = "(CASE WHEN {$subtitleExpr} LIKE ? ESCAPE '\\\\' THEN 40 ELSE 0 END)"; + $terms[] = "(CASE WHEN " . $m($subtitleExpr) . " THEN 40 ELSE 0 END)"; $params[] = $like; $types .= 's'; $publisherExpr = self::decodedSearchExpr('e_rel.nome'); $publisherMatch = "EXISTS (SELECT 1 FROM editori e_rel" . " WHERE e_rel.id = {$prefix}editore_id" - . " AND {$publisherExpr} LIKE ? ESCAPE '\\\\')"; + . " AND " . $m($publisherExpr) . ")"; $publisherParams = 1; if ($hasJunction) { $publisher2Expr = self::decodedSearchExpr('e2_rel.nome'); $publisherMatch .= " OR EXISTS (SELECT 1 FROM libri_editori le_rel" . " JOIN editori e2_rel ON e2_rel.id = le_rel.editore_id" . " WHERE le_rel.libro_id = {$prefix}id" - . " AND {$publisher2Expr} LIKE ? ESCAPE '\\\\')"; + . " AND " . $m($publisher2Expr) . ")"; $publisherParams++; } $terms[] = "(CASE WHEN ({$publisherMatch}) THEN 25 ELSE 0 END)"; @@ -514,11 +536,11 @@ public static function buildRelevanceOrder( $types .= 's'; } - $terms[] = "(CASE WHEN {$keywordsExpr} LIKE ? ESCAPE '\\\\' THEN 10 ELSE 0 END)"; + $terms[] = "(CASE WHEN " . $m($keywordsExpr) . " THEN 10 ELSE 0 END)"; $params[] = $like; $types .= 's'; - $terms[] = "(CASE WHEN {$descExpr} LIKE ? ESCAPE '\\\\' THEN 3 ELSE 0 END)"; + $terms[] = "(CASE WHEN " . $m($descExpr) . " THEN 3 ELSE 0 END)"; $params[] = $like; $types .= 's'; } @@ -560,7 +582,9 @@ private static function fulltextTermForWord(string $word): ?string */ private static function fulltextTokens(string $word): array { - if (preg_match_all('/[\p{L}\p{N}_]+/u', $word, $matches) !== 1) { + // Every token, not only a lone one: a quoted phrase needs each of its + // words (fulltextTermForWord() still rejects a multi-token word). + if (!preg_match_all('/[\p{L}\p{N}_]+/u', $word, $matches)) { return []; } return array_values(array_filter($matches[0], static fn(string $token): bool => $token !== '')); @@ -585,7 +609,7 @@ private static function isDefaultFulltextStopword(string $token): bool private static function likePattern(string $term): string { - return '%' . str_replace(['\\', '%', '_'], ['\\\\', '\\%', '\\_'], $term) . '%'; + return ExactSearch::likePattern($term); } /** @@ -602,15 +626,25 @@ private static function decodedSearchExpr(string $expression): string } /** - * Normalize a raw user search word for LIKE/FULLTEXT matching: strip a - * trailing '*' (the wildcard the FULLTEXT boolean path adds itself) and - * surrounding whitespace. Shared by buildSearchCondition (the WHERE) and - * buildRelevanceOrder (the ORDER BY) so the two paths tokenize identically + * Split a raw user query into search terms: quoted groups become one exact + * term (#501, see ExactSearch), other words are tolerant terms with a + * trailing '*' stripped (the wildcard the FULLTEXT boolean path adds + * itself). Shared by buildSearchCondition (the WHERE), the legacy fallback + * and buildRelevanceOrder (the ORDER BY) so all paths tokenize identically * and ranking never diverges from the rows the WHERE admitted. + * + * @return list */ - private static function normalizeSearchWord(string $word): string + private static function searchTerms(string $searchQuery): array { - return trim(rtrim($word, '*')); + $terms = []; + foreach (ExactSearch::tokenize(trim($searchQuery)) as $term) { + $value = $term['exact'] ? $term['term'] : trim(rtrim($term['term'], '*')); + if ($value !== '') { + $terms[] = ['term' => $value, 'exact' => $term['exact']]; + } + } + return $terms; } private static ?bool $hasDescrizionePlain = null; diff --git a/app/Views/autori/index.php b/app/Views/autori/index.php index c62ceb3a5..bda7b9b1e 100644 --- a/app/Views/autori/index.php +++ b/app/Views/autori/index.php @@ -56,11 +56,12 @@
-
@@ -237,7 +238,7 @@ class="form-input" /> url: (window.BASE_PATH || '') + '/api/autori', type: 'GET', data: function(d) { - d.search_nome = document.getElementById('search_nome').value; + d.search_text = document.getElementById('search_nome').value; d.search_pseudonimo = document.getElementById('search_pseudonimo').value; d.search_nazionalita = document.getElementById('search_nazionalita').value; d.search_sito = document.getElementById('search_sito').value; diff --git a/app/Views/editori/index.php b/app/Views/editori/index.php index 1bf0c43cc..f76cc8d28 100644 --- a/app/Views/editori/index.php +++ b/app/Views/editori/index.php @@ -56,11 +56,12 @@
-
diff --git a/app/Views/frontend/catalog.php b/app/Views/frontend/catalog.php index cbd3ce302..b8697b790 100644 --- a/app/Views/frontend/catalog.php +++ b/app/Views/frontend/catalog.php @@ -237,6 +237,7 @@ class="filters-mobile-toggle" +

diff --git a/app/Views/frontend/home-sections/hero.php b/app/Views/frontend/home-sections/hero.php index 59ed44d86..0e0c88d41 100644 --- a/app/Views/frontend/home-sections/hero.php +++ b/app/Views/frontend/home-sections/hero.php @@ -55,6 +55,7 @@
- " aria-label="" class="w-full pl-12 pr-4 py-3 lg:py-3.5 text-sm text-gray-800 bg-gray-50 border border-gray-300 rounded-2xl shadow-sm hover:shadow-md focus:border-gray-500 focus:outline-none focus:ring-2 focus:ring-gray-500/20 focus:bg-white transition-all duration-200 placeholder:text-gray-400" autocomplete="off"> diff --git a/app/Views/libri/index.php b/app/Views/libri/index.php index b1c1d4526..1e59b6b5b 100644 --- a/app/Views/libri/index.php +++ b/app/Views/libri/index.php @@ -138,8 +138,9 @@ - +

diff --git a/app/Views/prenotazioni/index.php b/app/Views/prenotazioni/index.php index 524d728b4..53ed04d3e 100644 --- a/app/Views/prenotazioni/index.php +++ b/app/Views/prenotazioni/index.php @@ -31,14 +31,14 @@
- - + + " type="text" id="admin_filter_libro" name="q_libro" class="form-input" placeholder="" value="" autocomplete="off">
    - - + + " type="text" id="admin_filter_utente" name="q_utente" class="form-input" placeholder="" value="" autocomplete="off">
      diff --git a/app/Views/prestiti/crea_prestito.php b/app/Views/prestiti/crea_prestito.php index acc43c7ce..94afd4dab 100644 --- a/app/Views/prestiti/crea_prestito.php +++ b/app/Views/prestiti/crea_prestito.php @@ -149,7 +149,7 @@ class="space-y-6 bg-white p-6 rounded-2xl border border-gray-200 shadow">
      - > + " type="text" id="utente_search" placeholder="" class="block w-full rounded-lg border border-gray-300 px-4 py-2 dark:border-gray-700 dark:bg-gray-900 dark:text-white " autocomplete="off" value="" >
      0 && !$presetUserLocked): ?> @@ -172,7 +172,7 @@ class="inline-flex items-center gap-2 whitespace-nowrap px-4 py-2.5 bg-gray-100
      - + " type="text" id="libro_search" placeholder="" class="mt-1 block w-full rounded-lg border border-gray-300 px-4 py-2 dark:border-gray-700 dark:bg-gray-900 dark:text-white" autocomplete="off" value="">
      diff --git a/app/Views/utenti/index.php b/app/Views/utenti/index.php index fe1edc237..62443edff 100644 --- a/app/Views/utenti/index.php +++ b/app/Views/utenti/index.php @@ -193,7 +193,7 @@ class="btn-icon btn-secondary p-2 text-gray-500 hover:text-gray-700 hover:bg-gra - + " id="search_text" placeholder="" class="form-input" />
      diff --git a/locale/da_DK.json b/locale/da_DK.json index 6f22831d9..44d0a0a0b 100644 --- a/locale/da_DK.json +++ b/locale/da_DK.json @@ -814,6 +814,7 @@ "Cerca testo": "Søg tekst", "Cerca titoli": "Søg titler", "Cerca titoli, autori, ISBN...": "Søg titler, forfattere, ISBN...", + "Usa le virgolette per la grafia esatta: \"Häffner\" trova solo Häffner, non Haffner.": "Brug anførselstegn for den nøjagtige stavemåde: \"Häffner\" finder kun Häffner, ikke Haffner.", "Cerca un authority record…": "Søg efter en normpost…", "Cerca un soggetto e premi Invio per aggiungere…": "Søg efter et emne og tryk på Enter for at tilføje…", "Cerca...": "Søg...", diff --git a/locale/de_DE.json b/locale/de_DE.json index ce1ecce77..5f325ba27 100644 --- a/locale/de_DE.json +++ b/locale/de_DE.json @@ -814,6 +814,7 @@ "Cerca testo": "Text suchen", "Cerca titoli": "Titel suchen", "Cerca titoli, autori, ISBN...": "Titel, Autoren, ISBN suchen...", + "Usa le virgolette per la grafia esatta: \"Häffner\" trova solo Häffner, non Haffner.": "Anführungszeichen suchen die genaue Schreibweise: \"Häffner\" findet nur Häffner, nicht Haffner.", "Cerca un authority record…": "Normdatensatz suchen…", "Cerca un soggetto e premi Invio per aggiungere…": "Schlagwort suchen und mit Enter hinzufügen…", "Cerca...": "Suchen...", diff --git a/locale/en_US.json b/locale/en_US.json index 22c255445..e80586f45 100644 --- a/locale/en_US.json +++ b/locale/en_US.json @@ -814,6 +814,7 @@ "Cerca testo": "Search text", "Cerca titoli": "Search Titles", "Cerca titoli, autori, ISBN...": "Search titles, authors, ISBN...", + "Usa le virgolette per la grafia esatta: \"Häffner\" trova solo Häffner, non Haffner.": "Use quotes for the exact spelling: \"Häffner\" finds only Häffner, not Haffner.", "Cerca un authority record…": "Search an authority record…", "Cerca un soggetto e premi Invio per aggiungere…": "Search a subject and press Enter to add…", "Cerca...": "Search...", diff --git a/locale/fr_FR.json b/locale/fr_FR.json index f1b9d12dd..146ce52b7 100644 --- a/locale/fr_FR.json +++ b/locale/fr_FR.json @@ -814,6 +814,7 @@ "Cerca testo": "Rechercher un texte", "Cerca titoli": "Rechercher des titres", "Cerca titoli, autori, ISBN...": "Rechercher titres, auteurs, ISBN...", + "Usa le virgolette per la grafia esatta: \"Häffner\" trova solo Häffner, non Haffner.": "Utilisez des guillemets pour l’orthographe exacte : \"Häffner\" ne trouve que Häffner, pas Haffner.", "Cerca un authority record…": "Rechercher une notice d'autorité…", "Cerca un soggetto e premi Invio per aggiungere…": "Recherchez un sujet et appuyez sur Entrée pour l'ajouter…", "Cerca...": "Rechercher...", diff --git a/locale/it_IT.json b/locale/it_IT.json index a25b40902..0cc3e40c2 100644 --- a/locale/it_IT.json +++ b/locale/it_IT.json @@ -814,6 +814,7 @@ "Cerca testo": "Cerca testo", "Cerca titoli": "Cerca titoli", "Cerca titoli, autori, ISBN...": "Cerca titoli, autori, ISBN...", + "Usa le virgolette per la grafia esatta: \"Häffner\" trova solo Häffner, non Haffner.": "Usa le virgolette per la grafia esatta: \"Häffner\" trova solo Häffner, non Haffner.", "Cerca un authority record…": "Cerca un authority record…", "Cerca un soggetto e premi Invio per aggiungere…": "Cerca un soggetto e premi Invio per aggiungere…", "Cerca...": "Cerca...", diff --git a/package-lock.json b/package-lock.json index f82a178ec..e56789840 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,7 +12,7 @@ "dependencies": { "sortablejs": "^1.15.6", "star-rating.js": "^4.3.1", - "tinymce": "^8.1.2" + "tinymce": "^8.10.0" }, "devDependencies": { "@axe-core/playwright": "4.13.0", @@ -135,9 +135,9 @@ "license": "MIT" }, "node_modules/tinymce": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/tinymce/-/tinymce-8.8.2.tgz", - "integrity": "sha512-wcUGaaAf4XFrQtbZtClbDN/QCqklXLlPt3+7UWliEoosuhnTOJUkXwf7Fzlq7agPnwkKKp1e4JGOhx3O1gWH3g==", + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/tinymce/-/tinymce-8.10.0.tgz", + "integrity": "sha512-/e+/B+VdbzO02hLzfr3EaoYKYdr3phC/yitG7I9vpi2NqYvtb04UxO/Ay4y9VPqDaQHyigdFnHv2zuTgF7mnZQ==", "license": "SEE LICENSE IN license.md" } } diff --git a/package.json b/package.json index 538bf71b3..92e8a2bf5 100644 --- a/package.json +++ b/package.json @@ -34,7 +34,7 @@ "dependencies": { "sortablejs": "^1.15.6", "star-rating.js": "^4.3.1", - "tinymce": "^8.1.2" + "tinymce": "^8.10.0" }, "devDependencies": { "@axe-core/playwright": "4.13.0", diff --git a/public/assets/catalog-pages.css b/public/assets/catalog-pages.css index 43e2b0e72..250fb1ff6 100644 --- a/public/assets/catalog-pages.css +++ b/public/assets/catalog-pages.css @@ -178,6 +178,14 @@ width: 18px; } +/* Under the catalogue search box: quotes = exact spelling (#501). */ +.search-hint { + margin: 0.375rem 0 0; + font-size: 0.75rem; + line-height: 1.4; + color: var(--text-muted); +} + .filter-options { display: flex; flex-direction: column; diff --git a/public/assets/pinakes-2026.css b/public/assets/pinakes-2026.css index b77d1a61c..94881cc85 100644 --- a/public/assets/pinakes-2026.css +++ b/public/assets/pinakes-2026.css @@ -624,6 +624,7 @@ body.pk main :is(.pk-filters, .filters-panel) :is(.search-box, .pk-filter-search body.pk main :is(.pk-filters, .filters-panel) :is(.search-box, .pk-filter-search) input:not([type=checkbox], [type=radio]) { font-size: 16px; } } body.pk :is(.pk-filters, .filters-panel) .search-box:focus-within, body.pk :is(.pk-filters, .filters-panel) .pk-filter-search:focus-within { border-color: var(--pk-accent); } +body.pk :is(.pk-filters, .filters-panel) .search-hint { margin: 6px 2px 0; font-size: 12px; line-height: 1.4; color: var(--pk-muted); } /* Authors, publishers, genres: a list of checkbox rows in a white box. */ body.pk :is(.pk-filters, .filters-panel) #authors-filter, body.pk :is(.pk-filters, .filters-panel) #publishers-filter, body.pk :is(.pk-filters, .filters-panel) #genres-filter { diff --git a/public/assets/tinymce/README.md b/public/assets/tinymce/README.md index c9b35bfb5..d58529afd 100644 --- a/public/assets/tinymce/README.md +++ b/public/assets/tinymce/README.md @@ -74,4 +74,4 @@ Visit the [TinyMCE website](https://tiny.cloud/) and check out the [TinyMCE docu ## License -Licensed under the terms of GNU General Public License Version 2 or later. For full details about the license, please check the LICENSE.md file. +License terms can be found in the license.md file. diff --git a/public/assets/tinymce/bower.json b/public/assets/tinymce/bower.json index afdc8fe91..8d79ef128 100644 --- a/public/assets/tinymce/bower.json +++ b/public/assets/tinymce/bower.json @@ -1,7 +1,7 @@ { "name": "tinymce", "description": "Web based JavaScript HTML WYSIWYG editor control.", - "license": "GPL-2.0-or-later", + "license": "SEE LICENSE IN license.md", "keywords": [ "wysiwyg", "tinymce", diff --git a/public/assets/tinymce/composer.json b/public/assets/tinymce/composer.json index 357793047..87d956935 100644 --- a/public/assets/tinymce/composer.json +++ b/public/assets/tinymce/composer.json @@ -1,9 +1,9 @@ { "name": "tinymce/tinymce", - "version": "8.1.2", + "version": "8.10.0", "description": "Web based JavaScript HTML WYSIWYG editor control.", "license": [ - "GPL-2.0-or-later" + "SEE LICENSE IN license.md" ], "keywords": [ "wysiwyg", diff --git a/public/assets/tinymce/icons/default/icons.js b/public/assets/tinymce/icons/default/icons.js index c971ce8f8..f90ba2656 100644 --- a/public/assets/tinymce/icons/default/icons.js +++ b/public/assets/tinymce/icons/default/icons.js @@ -5,27 +5,48 @@ tinymce.IconManager.add('default', { 'accordion': '', 'action-next': '', 'action-prev': '', + 'add-file': '', 'addtag': '', + 'adjust-length': '', + 'adjustments': '', + 'ai-assistant': '', + 'ai-chat-response': '', + 'ai-model': '', 'ai-prompt': '', + 'ai-review': '', + 'ai-translate': '', 'ai': '', 'align-center': '', 'align-justify': '', 'align-left': '', 'align-none': '', 'align-right': '', + 'alt-text': '', 'arrow-left': '', 'arrow-right': '', + 'attachment': '', + 'auto-image-enhancement': '', + 'blur': '', 'bold': '', 'bookmark': '', 'border-style': '', 'border-width': '', + 'box': '', 'brightness': '', 'browse': '', + 'camera': '', 'cancel': '', + 'caption': '', 'cell-background-color': '', 'cell-border-color': '', 'change-case': '', + 'change-tone': '', 'character-count': '', + 'chat-commands': '', + 'chat-reasoning': '', + 'chat-send': '', + 'chat-tool': '', + 'chat-web-search': '', 'checklist-rtl': '', 'checklist': '', 'checkmark-filled': '', @@ -37,12 +58,14 @@ tinymce.IconManager.add('default', { 'close-filled': '', 'close': '', 'code-sample': '', + 'collapse': '', 'color-levels': '', 'color-picker': '', 'color-swatch-remove-color': '', 'color-swatch': '', 'comment-add': '', 'comment': '', + 'continue-writing': '', 'contrast': '', 'copy': '', 'crop': '', @@ -52,19 +75,29 @@ tinymce.IconManager.add('default', { 'document-gear-properties': '', 'document-properties': '', 'drag': '', + 'dropbox': '', 'duplicate-column': '', 'duplicate-row': '', 'duplicate': '', - 'edit-block': '', + 'edit-block': '', 'edit-image': '', 'embed-page': '', 'embed': '', 'emoji': '', + 'evernote': '', + 'explain': '', + 'export-pdf': '', + 'export-word': '', 'export': '', + 'exposure': '', + 'fb': '', 'feedback': '', 'fill': '', + 'fix-grammar': '', + 'flickr': '', 'flip-horizontally': '', 'flip-vertically': '', + 'folder': '', 'footnote': '', 'format-code': '', 'format-painter': '', @@ -72,16 +105,26 @@ tinymce.IconManager.add('default', { 'fullscreen': '', 'gallery': '', 'gamma': '', + 'google-drive': '', + 'google-photos': '', + 'grayscale': '', 'help': '', 'highlight-bg-color': '', + 'highlight-key-points': '', 'home': '', 'horizontal-rule': '', + 'huddle': '', + 'image-decorative': '', + 'image-enhancements': '', 'image-options': '', 'image': '', + 'import-word': '', + 'improve-writing': '', 'indent': '', 'info': '', 'insert-character': '', 'insert-time': '', + 'instagram': '', 'invert': '', 'italic': '', 'language': '', @@ -110,17 +153,17 @@ tinymce.IconManager.add('default', { 'mentions': '', 'minus': '', 'more-drawer': '', + 'new-chat': '', 'new-document': '', 'new-tab': '', 'non-breaking': '', 'notice': '', + 'onedrive': '', 'ordered-list-rtl': '', 'ordered-list': '', 'orientation': '', + 'other-actions': '', 'outdent': '', - 'export-pdf': '', - 'export-word': '', - 'import-word': '', 'page-break': '', 'paragraph': '', 'paste-column-after': '', @@ -130,11 +173,14 @@ tinymce.IconManager.add('default', { 'paste-text': '', 'paste': '', 'permanent-pen': '', + 'photo-filter': '', + 'pin': '', 'plus': '', 'preferences': '', 'preview': '', 'print': '', 'quote': '', + 'reasoning': '', 'redo': '', 'reload': '', 'remove-formatting': '', @@ -142,10 +188,13 @@ tinymce.IconManager.add('default', { 'resize-handle': '', 'resize': '', 'restore-draft': '', + 'revert-all': '', + 'revert-changes': '', 'revision-history': '', 'rotate-left': '', 'rotate-right': '', 'rtl': '', + 'saturation': '', 'save': '', 'search': '', 'select-all': '', @@ -153,12 +202,20 @@ tinymce.IconManager.add('default', { 'send': '', 'settings': '', 'sharpen': '', + 'source-close': '', + 'source-file': '', + 'source-image': '', + 'source-link': '', + 'source-selection': '', 'sourcecode': '', 'spell-check': '', + 'stop': '', 'strike-through': '', 'subscript': '', 'suggestededits-badge': '', + 'suggestededits-tracking': '', 'suggestededits': '', + 'summarize': '', 'superscript': '', 'table-caption': '', 'table-cell-classes': '', @@ -188,6 +245,7 @@ tinymce.IconManager.add('default', { 'text-size-decrease': '', 'text-size-increase': '', 'toc': '', + 'transform-image': '', 'translate': '', 'typography': '', 'underline': '', @@ -195,42 +253,31 @@ tinymce.IconManager.add('default', { 'unlink': '', 'unlock': '', 'unordered-list': '', + 'unpin': '', 'unselected': '', + 'upload-from-device': '', + 'upload-from-link': '', 'upload': '', - 'add-file': '', - 'adjustments': '', - 'alt-text': '', - 'auto-image-enhancement': '', - 'blur': '', - 'box': '', - 'camera': '', - 'caption': '', - 'dropbox': '', - 'evernote': '', - 'exposure': '', - 'fb': '', - 'flickr': '', - 'folder': '', - 'google-drive': '', - 'google-photos': '', - 'grayscale': '', - 'huddle': '', - 'image-decorative': '', - 'image-enhancements': '', - 'instagram': '', - 'onedrive': '', - 'photo-filter': '', - 'revert-changes': '', - 'saturation': '', - 'transform-image': '', - 'vibrance': '', - 'vk': '', - 'warmth': '', 'user': '', 'vertical-align': '', + 'vibrance': '', 'visualblocks': '', 'visualchars': '', + 'vk': '', + 'warmth': '', 'warning': '', + 'web-search': '', + 'welcome-action-adjust-length': '', + 'welcome-action-ai-translate': '', + 'welcome-action-change-tone': '', + 'welcome-action-chat-commands': '', + 'welcome-action-continue-writing': '', + 'welcome-action-explain': '', + 'welcome-action-fix-grammar': '', + 'welcome-action-highlight-key-points': '', + 'welcome-action-improve-writing': '', + 'welcome-action-other-actions': '', + 'welcome-action-summarize': '', 'zoom-in': '', 'zoom-out': '', } diff --git a/public/assets/tinymce/icons/default/icons.min.js b/public/assets/tinymce/icons/default/icons.min.js index 4dbb649fb..a5f913a20 100644 --- a/public/assets/tinymce/icons/default/icons.min.js +++ b/public/assets/tinymce/icons/default/icons.min.js @@ -1 +1 @@ -tinymce.IconManager.add("default",{icons:{"accessibility-check":'',"accordion-toggle":'',accordion:'',"action-next":'',"action-prev":'',addtag:'',"ai-prompt":'',ai:'',"align-center":'',"align-justify":'',"align-left":'',"align-none":'',"align-right":'',"arrow-left":'',"arrow-right":'',bold:'',bookmark:'',"border-style":'',"border-width":'',brightness:'',browse:'',cancel:'',"cell-background-color":'',"cell-border-color":'',"change-case":'',"character-count":'',"checklist-rtl":'',checklist:'',"checkmark-filled":'',checkmark:'',"chevron-down":'',"chevron-left":'',"chevron-right":'',"chevron-up":'',"close-filled":'',close:'',"code-sample":'',"color-levels":'',"color-picker":'',"color-swatch-remove-color":'',"color-swatch":'',"comment-add":'',comment:'',contrast:'',copy:'',crop:'',"cut-column":'',"cut-row":'',cut:'',"document-gear-properties":'',"document-properties":'',drag:'',"duplicate-column":'',"duplicate-row":'',duplicate:'',"edit-block":'',"edit-image":'',"embed-page":'',embed:'',emoji:'',export:'',feedback:'',fill:'',"flip-horizontally":'',"flip-vertically":'',footnote:'',"format-code":'',"format-painter":'',format:'',fullscreen:'',gallery:'',gamma:'',help:'',"highlight-bg-color":'',home:'',"horizontal-rule":'',"image-options":'',image:'',indent:'',info:'',"insert-character":'',"insert-time":'',invert:'',italic:'',language:'',"line-height":'',line:'',link:'',"list-bull-circle":'',"list-bull-default":'',"list-bull-disc":'',"list-bull-square":'',"list-num-default-rtl":'',"list-num-default":'',"list-num-lower-alpha-rtl":'',"list-num-lower-alpha":'',"list-num-lower-greek-rtl":'',"list-num-lower-greek":'',"list-num-lower-roman-rtl":'',"list-num-lower-roman":'',"list-num-upper-alpha-rtl":'',"list-num-upper-alpha":'',"list-num-upper-roman-rtl":'',"list-num-upper-roman":'',lock:'',ltr:'',"math-equation":'',mentions:'',minus:'',"more-drawer":'',"new-document":'',"new-tab":'',"non-breaking":'',notice:'',"ordered-list-rtl":'',"ordered-list":'',orientation:'',outdent:'',"export-pdf":'',"export-word":'',"import-word":'',"page-break":'',paragraph:'',"paste-column-after":'',"paste-column-before":'',"paste-row-after":'',"paste-row-before":'',"paste-text":'',paste:'',"permanent-pen":'',plus:'',preferences:'',preview:'',print:'',quote:'',redo:'',reload:'',"remove-formatting":'',remove:'',"resize-handle":'',resize:'',"restore-draft":'',"revision-history":'',"rotate-left":'',"rotate-right":'',rtl:'',save:'',search:'',"select-all":'',selected:'',send:'',settings:'',sharpen:'',sourcecode:'',"spell-check":'',"strike-through":'',subscript:'',"suggestededits-badge":'',suggestededits:'',superscript:'',"table-caption":'',"table-cell-classes":'',"table-cell-properties":'',"table-cell-select-all":'',"table-cell-select-inner":'',"table-classes":'',"table-delete-column":'',"table-delete-row":'',"table-delete-table":'',"table-insert-column-after":'',"table-insert-column-before":'',"table-insert-row-above":'',"table-insert-row-after":'',"table-left-header":'',"table-merge-cells":'',"table-row-numbering-rtl":'',"table-row-numbering":'',"table-row-properties":'',"table-split-cells":'',"table-top-header":'',table:'',"template-add":'',template:'',"temporary-placeholder":'',"text-color":'',"text-size-decrease":'',"text-size-increase":'',toc:'',translate:'',typography:'',underline:'',undo:'',unlink:'',unlock:'',"unordered-list":'',unselected:'',upload:'',"add-file":'',adjustments:'',"alt-text":'',"auto-image-enhancement":'',blur:'',box:'',camera:'',caption:'',dropbox:'',evernote:'',exposure:'',fb:'',flickr:'',folder:'',"google-drive":'',"google-photos":'',grayscale:'',huddle:'',"image-decorative":'',"image-enhancements":'',instagram:'',onedrive:'',"photo-filter":'',"revert-changes":'',saturation:'',"transform-image":'',vibrance:'',vk:'',warmth:'',user:'',"vertical-align":'',visualblocks:'',visualchars:'',warning:'',"zoom-in":'',"zoom-out":''}}); \ No newline at end of file +tinymce.IconManager.add("default",{icons:{"accessibility-check":'',"accordion-toggle":'',accordion:'',"action-next":'',"action-prev":'',"add-file":'',addtag:'',"adjust-length":'',adjustments:'',"ai-assistant":'',"ai-chat-response":'',"ai-model":'',"ai-prompt":'',"ai-review":'',"ai-translate":'',ai:'',"align-center":'',"align-justify":'',"align-left":'',"align-none":'',"align-right":'',"alt-text":'',"arrow-left":'',"arrow-right":'',attachment:'',"auto-image-enhancement":'',blur:'',bold:'',bookmark:'',"border-style":'',"border-width":'',box:'',brightness:'',browse:'',camera:'',cancel:'',caption:'',"cell-background-color":'',"cell-border-color":'',"change-case":'',"change-tone":'',"character-count":'',"chat-commands":'',"chat-reasoning":'',"chat-send":'',"chat-tool":'',"chat-web-search":'',"checklist-rtl":'',checklist:'',"checkmark-filled":'',checkmark:'',"chevron-down":'',"chevron-left":'',"chevron-right":'',"chevron-up":'',"close-filled":'',close:'',"code-sample":'',collapse:'',"color-levels":'',"color-picker":'',"color-swatch-remove-color":'',"color-swatch":'',"comment-add":'',comment:'',"continue-writing":'',contrast:'',copy:'',crop:'',"cut-column":'',"cut-row":'',cut:'',"document-gear-properties":'',"document-properties":'',drag:'',dropbox:'',"duplicate-column":'',"duplicate-row":'',duplicate:'',"edit-block":'',"edit-image":'',"embed-page":'',embed:'',emoji:'',evernote:'',explain:'',"export-pdf":'',"export-word":'',export:'',exposure:'',fb:'',feedback:'',fill:'',"fix-grammar":'',flickr:'',"flip-horizontally":'',"flip-vertically":'',folder:'',footnote:'',"format-code":'',"format-painter":'',format:'',fullscreen:'',gallery:'',gamma:'',"google-drive":'',"google-photos":'',grayscale:'',help:'',"highlight-bg-color":'',"highlight-key-points":'',home:'',"horizontal-rule":'',huddle:'',"image-decorative":'',"image-enhancements":'',"image-options":'',image:'',"import-word":'',"improve-writing":'',indent:'',info:'',"insert-character":'',"insert-time":'',instagram:'',invert:'',italic:'',language:'',"line-height":'',line:'',link:'',"list-bull-circle":'',"list-bull-default":'',"list-bull-disc":'',"list-bull-square":'',"list-num-default-rtl":'',"list-num-default":'',"list-num-lower-alpha-rtl":'',"list-num-lower-alpha":'',"list-num-lower-greek-rtl":'',"list-num-lower-greek":'',"list-num-lower-roman-rtl":'',"list-num-lower-roman":'',"list-num-upper-alpha-rtl":'',"list-num-upper-alpha":'',"list-num-upper-roman-rtl":'',"list-num-upper-roman":'',lock:'',ltr:'',"math-equation":'',mentions:'',minus:'',"more-drawer":'',"new-chat":'',"new-document":'',"new-tab":'',"non-breaking":'',notice:'',onedrive:'',"ordered-list-rtl":'',"ordered-list":'',orientation:'',"other-actions":'',outdent:'',"page-break":'',paragraph:'',"paste-column-after":'',"paste-column-before":'',"paste-row-after":'',"paste-row-before":'',"paste-text":'',paste:'',"permanent-pen":'',"photo-filter":'',pin:'',plus:'',preferences:'',preview:'',print:'',quote:'',reasoning:'',redo:'',reload:'',"remove-formatting":'',remove:'',"resize-handle":'',resize:'',"restore-draft":'',"revert-all":'',"revert-changes":'',"revision-history":'',"rotate-left":'',"rotate-right":'',rtl:'',saturation:'',save:'',search:'',"select-all":'',selected:'',send:'',settings:'',sharpen:'',"source-close":'',"source-file":'',"source-image":'',"source-link":'',"source-selection":'',sourcecode:'',"spell-check":'',stop:'',"strike-through":'',subscript:'',"suggestededits-badge":'',"suggestededits-tracking":'',suggestededits:'',summarize:'',superscript:'',"table-caption":'',"table-cell-classes":'',"table-cell-properties":'',"table-cell-select-all":'',"table-cell-select-inner":'',"table-classes":'',"table-delete-column":'',"table-delete-row":'',"table-delete-table":'',"table-insert-column-after":'',"table-insert-column-before":'',"table-insert-row-above":'',"table-insert-row-after":'',"table-left-header":'',"table-merge-cells":'',"table-row-numbering-rtl":'',"table-row-numbering":'',"table-row-properties":'',"table-split-cells":'',"table-top-header":'',table:'',"template-add":'',template:'',"temporary-placeholder":'',"text-color":'',"text-size-decrease":'',"text-size-increase":'',toc:'',"transform-image":'',translate:'',typography:'',underline:'',undo:'',unlink:'',unlock:'',"unordered-list":'',unpin:'',unselected:'',"upload-from-device":'',"upload-from-link":'',upload:'',user:'',"vertical-align":'',vibrance:'',visualblocks:'',visualchars:'',vk:'',warmth:'',warning:'',"web-search":'',"welcome-action-adjust-length":'',"welcome-action-ai-translate":'',"welcome-action-change-tone":'',"welcome-action-chat-commands":'',"welcome-action-continue-writing":'',"welcome-action-explain":'',"welcome-action-fix-grammar":'',"welcome-action-highlight-key-points":'',"welcome-action-improve-writing":'',"welcome-action-other-actions":'',"welcome-action-summarize":'',"zoom-in":'',"zoom-out":''}}); \ No newline at end of file diff --git a/public/assets/tinymce/license.md b/public/assets/tinymce/license.md new file mode 100644 index 000000000..f05af600a --- /dev/null +++ b/public/assets/tinymce/license.md @@ -0,0 +1,9 @@ +Copyright (c) 2025 Ephox Corporation DBA Tiny Technologies, Inc. + +SOFTWARE TERMS & CONDITIONS OF USE + +Licensed under, and subject to the restrictions of: +1. The terms of [GNU General Public License Version 2 or later](http://www.gnu.org/licenses/gpl.html); or +2. The Tiny Technologies, Inc Software Terms & Conditions of Use presented at and specifically the Tiny Self-Hosted License Agreement, unless you have signed a negotiated commercial license agreement with us in which case your use is governed by those terms. By use of this Software you have agreed to these Tiny Technologies, Inc Software Terms & Conditions of Use. + +If you are uncertain about your licensing requirements, please contact for further clarification. diff --git a/public/assets/tinymce/models/dom/model.js b/public/assets/tinymce/models/dom/model.js index d2654e174..55fb2bd3f 100644 --- a/public/assets/tinymce/models/dom/model.js +++ b/public/assets/tinymce/models/dom/model.js @@ -1,5 +1,5 @@ /** - * TinyMCE version 8.1.2 (TBD) + * TinyMCE version 8.10.0 (2026-10-14) */ (function () { @@ -9,13 +9,12 @@ /* eslint-disable @typescript-eslint/no-wrapper-object-types */ const hasProto = (v, constructor, predicate) => { - var _a; if (predicate(v, constructor.prototype)) { return true; } else { // String-based fallback time - return ((_a = v.constructor) === null || _a === void 0 ? void 0 : _a.name) === constructor.name; + return v.constructor?.name === constructor.name; } }; const typeOf = (x) => { @@ -101,6 +100,11 @@ * strict-null-checks */ class Optional { + tag; + value; + // Sneaky optimisation: every instance of Optional.none is identical, so just + // reuse the same object + static singletonNone = new Optional(false); // The internal representation has a `tag` and a `value`, but both are // private: able to be console.logged, but not able to be accessed by code constructor(tag, value) { @@ -268,7 +272,7 @@ */ getOrDie(message) { if (!this.tag) { - throw new Error(message !== null && message !== void 0 ? message : 'Called getOrDie on None'); + throw new Error(message ?? 'Called getOrDie on None'); } else { return this.value; @@ -332,9 +336,6 @@ return this.tag ? `some(${this.value})` : 'none()'; } } - // Sneaky optimisation: every instance of Optional.none is identical, so just - // reuse the same object - Optional.singletonNone = new Optional(false); const nativeSlice = Array.prototype.slice; const nativeIndexOf = Array.prototype.indexOf; @@ -1350,7 +1351,7 @@ const detectBrowser$1 = (browsers, userAgentData) => { return findMap(userAgentData.brands, (uaBrand) => { const lcBrand = uaBrand.brand.toLowerCase(); - return find$1(browsers, (browser) => { var _a; return lcBrand === ((_a = browser.brand) === null || _a === void 0 ? void 0 : _a.toLowerCase()); }) + return find$1(browsers, (browser) => lcBrand === browser.brand?.toLowerCase()) .map((info) => ({ current: info.name, version: Version.nu(parseInt(uaBrand.version, 10), 0) @@ -2220,8 +2221,8 @@ if (body === element.dom) { return SugarPosition(body.offsetLeft, body.offsetTop); } - const scrollTop = firstDefinedOrZero(win === null || win === void 0 ? void 0 : win.pageYOffset, html.scrollTop); - const scrollLeft = firstDefinedOrZero(win === null || win === void 0 ? void 0 : win.pageXOffset, html.scrollLeft); + const scrollTop = firstDefinedOrZero(win?.pageYOffset, html.scrollTop); + const scrollLeft = firstDefinedOrZero(win?.pageXOffset, html.scrollLeft); const clientTop = firstDefinedOrZero(html.clientTop, body.clientTop); const clientLeft = firstDefinedOrZero(html.clientLeft, body.clientLeft); return viewport(element).translate(scrollLeft - clientLeft, scrollTop - clientTop); @@ -2575,21 +2576,18 @@ range }; - const caretPositionFromPoint = (doc, x, y) => { - var _a; - return Optional.from((_a = doc.caretPositionFromPoint) === null || _a === void 0 ? void 0 : _a.call(doc, x, y)) - .bind((pos) => { - // It turns out that Firefox can return null for pos.offsetNode - if (pos.offsetNode === null) { - return Optional.none(); - } - const r = doc.createRange(); - r.setStart(pos.offsetNode, pos.offset); - r.collapse(); - return Optional.some(r); - }); - }; - const caretRangeFromPoint = (doc, x, y) => { var _a; return Optional.from((_a = doc.caretRangeFromPoint) === null || _a === void 0 ? void 0 : _a.call(doc, x, y)); }; + const caretPositionFromPoint = (doc, x, y) => Optional.from(doc.caretPositionFromPoint?.(x, y)) + .bind((pos) => { + // It turns out that Firefox can return null for pos.offsetNode + if (pos.offsetNode === null) { + return Optional.none(); + } + const r = doc.createRange(); + r.setStart(pos.offsetNode, pos.offset); + r.collapse(); + return Optional.some(r); + }); + const caretRangeFromPoint = (doc, x, y) => Optional.from(doc.caretRangeFromPoint?.(x, y)); const availableSearch = (doc, x, y) => { if (doc.caretPositionFromPoint) { return caretPositionFromPoint(doc, x, y); // defined standard, firefox only @@ -2663,7 +2661,7 @@ try { setLegacyRtlRange(win, selection, start, soffset, finish, foffset); } - catch (_a) { + catch { // If it does fail, try again with ltr. doSetRange(win, finish, foffset, start, soffset); } @@ -3868,7 +3866,7 @@ }; const run = (operation, extract, adjustment, postAction, genWrappers, table, target, generators, behaviours) => { const warehouse = Warehouse.fromTable(table); - const tableSection = Optional.from(behaviours === null || behaviours === void 0 ? void 0 : behaviours.section).getOrThunk(TableSection.fallback); + const tableSection = Optional.from(behaviours?.section).getOrThunk(TableSection.fallback); const output = extract(warehouse, target).map((info) => { const model = fromWarehouse(warehouse, generators); const result = operation(model, info, eq$1, genWrappers(generators), tableSection); @@ -3883,8 +3881,8 @@ }); return output.bind((out) => { const newElements = render$1(table, out.grid); - const tableSizing = Optional.from(behaviours === null || behaviours === void 0 ? void 0 : behaviours.sizing).getOrThunk(() => TableSize.getTableSize(table)); - const resizing = Optional.from(behaviours === null || behaviours === void 0 ? void 0 : behaviours.resize).getOrThunk(preserveTable); + const tableSizing = Optional.from(behaviours?.sizing).getOrThunk(() => TableSize.getTableSize(table)); + const resizing = Optional.from(behaviours?.resize).getOrThunk(preserveTable); adjustment(table, out.grid, out.info, { sizing: tableSizing, resize: resizing, section: tableSection }); postAction(table); // Update locked cols attribute @@ -5823,9 +5821,8 @@ return someIf(isEditable(elem), elem); })); const elementFromGrid = (grid, row, column) => { - var _a, _b; const rows = extractGridDetails(grid).rows; - return Optional.from((_b = (_a = rows[row]) === null || _a === void 0 ? void 0 : _a.cells[column]) === null || _b === void 0 ? void 0 : _b.element) + return Optional.from(rows[row]?.cells[column]?.element) .filter(isEditable) // Fallback to the first valid position in the table .orThunk(() => findEditableCursorPosition(rows)); @@ -6431,6 +6428,7 @@ }; const div = SugarElement.fromTag('div'); set$2(div, 'role', 'presentation'); + set$2(div, 'data-mce-bogus', 'all'); setAll(div, { position: 'fixed', left: '0px', @@ -6494,8 +6492,7 @@ }); const transform = (mutation, settings = {}) => { - var _a; - const mode = (_a = settings.mode) !== null && _a !== void 0 ? _a : MouseDrag; + const mode = settings.mode ?? MouseDrag; return setup(mutation, mode, settings); }; @@ -6710,9 +6707,13 @@ /* mousedown on resize bar: start dragging when the bar is clicked, storing the initial position. */ const mousedown = bind(wire.parent(), 'mousedown', (event) => { if (isRowBar(event.target)) { + event.prevent(); + event.stop(); handler(event.target, 'top'); } if (isColBar(event.target)) { + event.prevent(); + event.stop(); handler(event.target, 'left'); } }); @@ -6812,10 +6813,9 @@ // Note: This is also contained in the table plugin Options.ts file const defaultWidth = '100%'; const getPixelForcedWidth = (editor) => { - var _a; // Determine the inner size of the parent block element where the table will be inserted const dom = editor.dom; - const parentBlock = (_a = dom.getParent(editor.selection.getStart(), dom.isBlock)) !== null && _a !== void 0 ? _a : editor.getBody(); + const parentBlock = dom.getParent(editor.selection.getStart(), dom.isBlock) ?? editor.getBody(); return getInner(SugarElement.fromDom(parentBlock)) + 'px'; }; // Note: This is also contained in the table plugin Options.ts file @@ -6893,6 +6893,14 @@ processor: 'boolean', default: true }); + registerOption('table_default_header_rows', { + processor: 'number', + default: 0 + }); + registerOption('table_default_header_cols', { + processor: 'number', + default: 0 + }); }; const getTableCloneElements = (editor) => { return Optional.from(editor.options.get('table_clone_elements')); @@ -6912,6 +6920,8 @@ const hasTableResizeBars = option('table_resize_bars'); const shouldStyleWithCss = option('table_style_by_css'); const shouldMergeContentOnPaste = option('table_merge_content_on_paste'); + const defaultHeaderRows = option('table_default_header_rows'); + const defaultHeaderCols = option('table_default_header_cols'); const getTableDefaultAttributes = (editor) => { // Note: The we don't rely on the default here as we need to dynamically lookup the widths based on the current editor state const options = editor.options; @@ -6944,14 +6954,18 @@ const getSelectionStart = (editor) => SugarElement.fromDom(editor.selection.getStart()); const getPixelWidth = (elm) => elm.getBoundingClientRect().width; const getPixelHeight = (elm) => elm.getBoundingClientRect().height; + const addPxSuffix = (size) => /^\d+(\.\d+)?$/.test(size) ? size + 'px' : size; const getRawValue = (prop) => (editor, elm) => { const raw = editor.dom.getStyle(elm, prop) || editor.dom.getAttrib(elm, prop); - return Optional.from(raw).filter(isNotEmpty); + // If a value has no unit, assume it is a pixel value + return Optional.from(raw) + .filter(isNotEmpty) + .map(addPxSuffix); }; - const getRawWidth = getRawValue('width'); - const getRawHeight = getRawValue('height'); const isPercentage$1 = (value) => /^(\d+(\.\d+)?)%$/.test(value); const isPixel = (value) => /^(\d+(\.\d+)?)px$/.test(value); + const getRawWidth = getRawValue('width'); + const getRawHeight = getRawValue('height'); const isInEditableContext$1 = (cell) => closest$2(cell, isTag('table')).exists(isEditable$1); const lookupTable = (container) => { @@ -8358,8 +8372,8 @@ const insertTable = (editor, rows, columns, options = {}) => { const checkInput = (val) => isNumber(val) && val > 0; if (checkInput(rows) && checkInput(columns)) { - const headerRows = options.headerRows || 0; - const headerColumns = options.headerColumns || 0; + const headerRows = options.headerRows ?? defaultHeaderRows(editor); + const headerColumns = options.headerColumns ?? defaultHeaderCols(editor); return insert(editor, columns, rows, headerColumns, headerRows); } else { @@ -8384,8 +8398,7 @@ global.write([fakeClipboardItem]); }; const getData = (type) => { - var _a; - const items = (_a = global.read()) !== null && _a !== void 0 ? _a : []; + const items = global.read() ?? []; return findMap(items, (item) => Optional.from(item.getType(type))); }; const clearData = (type) => { @@ -8780,7 +8793,6 @@ const isCornerResize = (origin) => startsWith(origin, 'corner-'); const getCornerLocation = (origin) => removeLeading(origin, 'corner-'); const TableResizeHandler = (editor) => { - const selectionRng = value(); const tableResize = value(); const resizeWire = value(); let startW; @@ -8850,9 +8862,6 @@ if (!editor.mode.isReadOnly()) { sz.on(); } - sz.events.startDrag.bind((_event) => { - selectionRng.set(editor.selection.getRng()); - }); sz.events.beforeResize.bind((event) => { const rawTable = event.table.dom; fireObjectResizeStart(editor, rawTable, getPixelWidth(rawTable), getPixelHeight(rawTable), barResizerPrefix + event.type); @@ -8861,10 +8870,6 @@ const table = event.table; const rawTable = table.dom; removeDataStyle(table); - selectionRng.on((rng) => { - editor.selection.setRng(rng); - editor.focus(); - }); fireObjectResized(editor, rawTable, getPixelWidth(rawTable), getPixelHeight(rawTable), barResizerPrefix + event.type); editor.undoManager.add(); }); diff --git a/public/assets/tinymce/models/dom/model.min.js b/public/assets/tinymce/models/dom/model.min.js index 9b47f51f1..0f7ec1256 100644 --- a/public/assets/tinymce/models/dom/model.min.js +++ b/public/assets/tinymce/models/dom/model.min.js @@ -1 +1 @@ -!function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.ModelManager");const t=e=>t=>(e=>{const t=typeof e;return null===e?"null":"object"===t&&Array.isArray(e)?"array":"object"===t&&(o=n=e,(r=String).prototype.isPrototypeOf(o)||(null===(s=n.constructor)||void 0===s?void 0:s.name)===r.name)?"string":t;var o,n,r,s})(t)===e,o=e=>t=>typeof t===e,n=e=>t=>e===t,r=t("string"),s=t("object"),l=t("array"),a=n(null),c=o("boolean"),i=n(void 0),m=e=>!(e=>null==e)(e),d=o("function"),u=o("number"),f=()=>{},g=e=>()=>e,h=e=>e,p=(e,t)=>e===t;function b(e,...t){return(...o)=>{const n=t.concat(o);return e.apply(null,n)}}const w=e=>t=>!e(t),v=e=>e(),y=g(!1),x=g(!0);class C{constructor(e,t){this.tag=e,this.value=t}static some(e){return new C(!0,e)}static none(){return C.singletonNone}fold(e,t){return this.tag?t(this.value):e()}isSome(){return this.tag}isNone(){return!this.tag}map(e){return this.tag?C.some(e(this.value)):C.none()}bind(e){return this.tag?e(this.value):C.none()}exists(e){return this.tag&&e(this.value)}forall(e){return!this.tag||e(this.value)}filter(e){return!this.tag||e(this.value)?this:C.none()}getOr(e){return this.tag?this.value:e}or(e){return this.tag?this:e}getOrThunk(e){return this.tag?this.value:e()}orThunk(e){return this.tag?this:e()}getOrDie(e){if(this.tag)return this.value;throw new Error(null!=e?e:"Called getOrDie on None")}static from(e){return m(e)?C.some(e):C.none()}getOrNull(){return this.tag?this.value:null}getOrUndefined(){return this.value}each(e){this.tag&&e(this.value)}toArray(){return this.tag?[this.value]:[]}toString(){return this.tag?`some(${this.value})`:"none()"}}C.singletonNone=new C(!1);const S=Array.prototype.slice,T=Array.prototype.indexOf,R=Array.prototype.push,D=(e,t)=>{return o=e,n=t,T.call(o,n)>-1;var o,n},O=(e,t)=>{for(let o=0,n=e.length;o{const o=[];for(let n=0;n{const o=e.length,n=new Array(o);for(let r=0;r{for(let o=0,n=e.length;o{const o=[],n=[];for(let r=0,s=e.length;r{const o=[];for(let n=0,r=e.length;n(((e,t)=>{for(let o=e.length-1;o>=0;o--)t(e[o],o)})(e,((e,n)=>{o=t(o,e,n)})),o),A=(e,t,o)=>(N(e,((e,n)=>{o=t(o,e,n)})),o),L=(e,t)=>((e,t,o)=>{for(let n=0,r=e.length;n{for(let o=0,n=e.length;o{const t=[];for(let o=0,n=e.length;oW(E(e,t)),P=(e,t)=>{for(let o=0,n=e.length;o{const o={};for(let n=0,r=e.length;nt>=0&&tF(e,0),$=e=>F(e,e.length-1),V=(e,t)=>{for(let o=0;o{const o=q(e);for(let n=0,r=o.length;nY(e,((e,o)=>({k:o,v:t(e,o)}))),Y=(e,t)=>{const o={};return G(e,((e,n)=>{const r=t(e,n);o[r.k]=r.v})),o},J=(e,t)=>{const o=[];return G(e,((e,n)=>{o.push(t(e,n))})),o},Q=e=>J(e,h),X=(e,t)=>U.call(e,t),Z=e=>{if(!l(e))throw new Error("cases must be an array");if(0===e.length)throw new Error("there must be at least one case");const t=[],o={};return N(e,((n,r)=>{const s=q(n);if(1!==s.length)throw new Error("one and only one name per case");const a=s[0],c=n[a];if(void 0!==o[a])throw new Error("duplicate key detected:"+a);if("cata"===a)throw new Error("cannot have a case named cata (sorry)");if(!l(c))throw new Error("case arguments must be an array");t.push(a),o[a]=(...o)=>{const n=o.length;if(n!==c.length)throw new Error("Wrong number of arguments to case "+a+". Expected "+c.length+" ("+c+"), got "+n);return{fold:(...t)=>{if(t.length!==e.length)throw new Error("Wrong number of arguments to fold. Expected "+e.length+", got "+t.length);return t[r].apply(null,o)},match:e=>{const n=q(e);if(t.length!==n.length)throw new Error("Wrong number of arguments to match. Expected: "+t.join(",")+"\nActual: "+n.join(","));if(!P(t,(e=>D(n,e))))throw new Error("Not all branches were specified when using match. Specified: "+n.join(", ")+"\nRequired: "+t.join(", "));return e[a].apply(null,o)},log:e=>{console.log(e,{constructors:t,constructor:a,params:o})}}}})),o},ee=e=>{let t=e;return{get:()=>t,set:e=>{t=e}}},te=e=>e.slice(0).sort(),oe=(e,t)=>{const o=_(t,(t=>!D(e,t)));o.length>0&&(e=>{throw new Error("Unsupported keys for object: "+te(e).join(", "))})(o)},ne=e=>((e,t)=>((e,t,o)=>{if(0===t.length)throw new Error("You must specify at least one required field.");return((e,t)=>{if(!l(t))throw new Error("The "+e+" fields must be an array. Was: "+t+".");N(t,(t=>{if(!r(t))throw new Error("The value "+t+" in the "+e+" fields was not a string.")}))})("required",t),(e=>{const t=te(e);L(t,((e,o)=>o{throw new Error("The field: "+e+" occurs more than once in the combined fields: ["+t.join(", ")+"].")}))})(t),n=>{const r=q(n);P(t,(e=>D(r,e)))||((e,t)=>{throw new Error("All required keys ("+te(e).join(", ")+") were not specified. Specified keys were: "+te(t).join(", ")+".")})(t,r),e(t,r);const s=_(t,(e=>!o.validate(n[e],e)));return s.length>0&&((e,t)=>{throw new Error("All values need to be of type: "+t+". Keys ("+te(e).join(", ")+") were not.")})(s,o.label),n}})(e,t,{validate:d,label:"function"}))(oe,e),re=e=>{const t=t=>t(e),o=g(e),n=()=>r,r={tag:!0,inner:e,fold:(t,o)=>o(e),isValue:x,isError:y,map:t=>le.value(t(e)),mapError:n,bind:t,exists:t,forall:t,getOr:o,or:n,getOrThunk:o,orThunk:n,getOrDie:o,each:t=>{t(e)},toOptional:()=>C.some(e)};return r},se=e=>{const t=()=>o,o={tag:!1,inner:e,fold:(t,o)=>t(e),isValue:y,isError:x,map:t,mapError:t=>le.error(t(e)),bind:t,exists:y,forall:x,getOr:h,or:h,getOrThunk:v,orThunk:v,getOrDie:(n=String(e),()=>{throw new Error(n)}),each:f,toOptional:C.none};var n;return o},le={value:re,error:se,fromOption:(e,t)=>e.fold((()=>se(t)),re)},ae="undefined"!=typeof window?window:Function("return this;")(),ce=e=>{const t=e.replace(/\./g,"-");return{resolve:e=>t+"-"+e}},ie=(e,t,o=p)=>e.exists((e=>o(e,t))),me=e=>{const t=[],o=e=>{t.push(e)};for(let t=0;te?C.some(t):C.none(),ue=(e,t)=>((e,t)=>{let o=null!=t?t:ae;for(let t=0;t{const e=(e=>{const t=ee(C.none()),o=()=>t.get().each(e);return{clear:()=>{o(),t.set(C.none())},isSet:()=>t.get().isSome(),get:()=>t.get(),set:e=>{o(),t.set(C.some(e))}}})(f);return{...e,on:t=>e.get().each(t)}},ge=(e,t,o)=>""===t||e.length>=t.length&&e.substr(o,o+t.length)===t,he=(e,t,o=0,n)=>{const r=e.indexOf(t,o);return-1!==r&&(!!i(n)||r+t.length<=n)},pe=(e,t)=>ge(e,t,0),be=(e,t)=>ge(e,t,e.length-t.length),we=(e=>t=>t.replace(e,""))(/^\s+|\s+$/g),ve=e=>e.length>0,ye=e=>{let t,o=!1;return(...n)=>(o||(o=!0,t=e.apply(null,n)),t)},xe=["tfoot","thead","tbody","colgroup"],Ce=(e,t,o)=>({element:e,rowspan:t,colspan:o}),Se=(e,t,o)=>({element:e,cells:t,section:o}),Te=(e,t,o)=>({element:e,isNew:t,isLocked:o}),Re=(e,t,o,n)=>({element:e,cells:t,section:o,isNew:n}),De=(e,t,o)=>{const n=e.cells,r=n.slice(0,t),s=n.slice(t),l=r.concat(o).concat(s);return Ee(e,l)},Oe=(e,t,o)=>De(e,t,[o]),ke=(e,t,o)=>{e.cells[t]=o},Ee=(e,t)=>Re(e.element,t,e.section,e.isNew),Ne=(e,t)=>e.cells[t],Be=(e,t)=>Ne(e,t).element,_e=e=>e.cells.length,ze=e=>{const t=B(e,(e=>"colgroup"===e.section));return{rows:t.fail,cols:t.pass}},Ae=(e,t,o)=>{const n=E(e.cells,o);return Re(t(e.element),n,e.section,!0)},Le=e=>{if(null==e)throw new Error("Node cannot be null or undefined");return{dom:e}},Me={fromHtml:(e,t)=>{const o=(t||document).createElement("div");if(o.innerHTML=e,!o.hasChildNodes()||o.childNodes.length>1){const t="HTML does not have a single root node";throw console.error(t,e),new Error(t)}return Le(o.childNodes[0])},fromTag:(e,t)=>{const o=(t||document).createElement(e);return Le(o)},fromText:(e,t)=>{const o=(t||document).createTextNode(e);return Le(o)},fromDom:Le,fromPoint:(e,t,o)=>C.from(e.dom.elementFromPoint(t,o)).map(Le)},We=(e,t)=>{const o=e.document.createRange();return o.selectNode(t.dom),o},je=(e,t)=>{const o=e.document.createRange();return Pe(o,t),o},Pe=(e,t)=>e.selectNodeContents(t.dom),Ie=(e,t,o)=>{const n=e.document.createRange();var r;return r=n,t.fold((e=>{r.setStartBefore(e.dom)}),((e,t)=>{r.setStart(e.dom,t)}),(e=>{r.setStartAfter(e.dom)})),((e,t)=>{t.fold((t=>{e.setEndBefore(t.dom)}),((t,o)=>{e.setEnd(t.dom,o)}),(t=>{e.setEndAfter(t.dom)}))})(n,o),n},Fe=(e,t,o,n,r)=>{const s=e.document.createRange();return s.setStart(t.dom,o),s.setEnd(n.dom,r),s},He=e=>({left:e.left,top:e.top,right:e.right,bottom:e.bottom,width:e.width,height:e.height}),$e=Z([{ltr:["start","soffset","finish","foffset"]},{rtl:["start","soffset","finish","foffset"]}]),Ve=(e,t,o)=>t(Me.fromDom(o.startContainer),o.startOffset,Me.fromDom(o.endContainer),o.endOffset),qe=(e,t)=>{const o=((e,t)=>t.match({domRange:e=>({ltr:g(e),rtl:C.none}),relative:(t,o)=>({ltr:ye((()=>Ie(e,t,o))),rtl:ye((()=>C.some(Ie(e,o,t))))}),exact:(t,o,n,r)=>({ltr:ye((()=>Fe(e,t,o,n,r))),rtl:ye((()=>C.some(Fe(e,n,r,t,o))))})}))(e,t);return((e,t)=>{const o=t.ltr();return o.collapsed?t.rtl().filter((e=>!1===e.collapsed)).map((e=>$e.rtl(Me.fromDom(e.endContainer),e.endOffset,Me.fromDom(e.startContainer),e.startOffset))).getOrThunk((()=>Ve(0,$e.ltr,o))):Ve(0,$e.ltr,o)})(0,o)},Ue=(e,t)=>qe(e,t).match({ltr:(t,o,n,r)=>{const s=e.document.createRange();return s.setStart(t.dom,o),s.setEnd(n.dom,r),s},rtl:(t,o,n,r)=>{const s=e.document.createRange();return s.setStart(n.dom,r),s.setEnd(t.dom,o),s}});$e.ltr,$e.rtl;const Ge=(e,t)=>{const o=e.dom;if(1!==o.nodeType)return!1;{const e=o;if(void 0!==e.matches)return e.matches(t);if(void 0!==e.msMatchesSelector)return e.msMatchesSelector(t);if(void 0!==e.webkitMatchesSelector)return e.webkitMatchesSelector(t);if(void 0!==e.mozMatchesSelector)return e.mozMatchesSelector(t);throw new Error("Browser lacks native selectors")}},Ke=e=>1!==e.nodeType&&9!==e.nodeType&&11!==e.nodeType||0===e.childElementCount,Ye=(e,t)=>{const o=void 0===t?document:t.dom;return Ke(o)?C.none():C.from(o.querySelector(e)).map(Me.fromDom)},Je=(e,t)=>e.dom===t.dom,Qe=(e,t)=>{const o=e.dom,n=t.dom;return o!==n&&o.contains(n)},Xe=Ge,Ze=()=>et(0,0),et=(e,t)=>({major:e,minor:t}),tt={nu:et,detect:(e,t)=>{const o=String(t).toLowerCase();return 0===e.length?Ze():((e,t)=>{const o=((e,t)=>{for(let o=0;oNumber(t.replace(o,"$"+e));return et(n(1),n(2))})(e,o)},unknown:Ze},ot=(e,t)=>{const o=String(t).toLowerCase();return L(e,(e=>e.search(o)))},nt=/.*?version\/\ ?([0-9]+)\.([0-9]+).*/,rt=e=>t=>he(t,e),st=[{name:"Edge",versionRegexes:[/.*?edge\/ ?([0-9]+)\.([0-9]+)$/],search:e=>he(e,"edge/")&&he(e,"chrome")&&he(e,"safari")&&he(e,"applewebkit")},{name:"Chromium",brand:"Chromium",versionRegexes:[/.*?chrome\/([0-9]+)\.([0-9]+).*/,nt],search:e=>he(e,"chrome")&&!he(e,"chromeframe")},{name:"IE",versionRegexes:[/.*?msie\ ?([0-9]+)\.([0-9]+).*/,/.*?rv:([0-9]+)\.([0-9]+).*/],search:e=>he(e,"msie")||he(e,"trident")},{name:"Opera",versionRegexes:[nt,/.*?opera\/([0-9]+)\.([0-9]+).*/],search:rt("opera")},{name:"Firefox",versionRegexes:[/.*?firefox\/\ ?([0-9]+)\.([0-9]+).*/],search:rt("firefox")},{name:"Safari",versionRegexes:[nt,/.*?cpu os ([0-9]+)_([0-9]+).*/],search:e=>(he(e,"safari")||he(e,"mobile/"))&&he(e,"applewebkit")}],lt=[{name:"Windows",search:rt("win"),versionRegexes:[/.*?windows\ nt\ ?([0-9]+)\.([0-9]+).*/]},{name:"iOS",search:e=>he(e,"iphone")||he(e,"ipad"),versionRegexes:[/.*?version\/\ ?([0-9]+)\.([0-9]+).*/,/.*cpu os ([0-9]+)_([0-9]+).*/,/.*cpu iphone os ([0-9]+)_([0-9]+).*/]},{name:"Android",search:rt("android"),versionRegexes:[/.*?android\ ?([0-9]+)\.([0-9]+).*/]},{name:"macOS",search:rt("mac os x"),versionRegexes:[/.*?mac\ os\ x\ ?([0-9]+)_([0-9]+).*/]},{name:"Linux",search:rt("linux"),versionRegexes:[]},{name:"Solaris",search:rt("sunos"),versionRegexes:[]},{name:"FreeBSD",search:rt("freebsd"),versionRegexes:[]},{name:"ChromeOS",search:rt("cros"),versionRegexes:[/.*?chrome\/([0-9]+)\.([0-9]+).*/]}],at={browsers:g(st),oses:g(lt)},ct="Edge",it="Chromium",mt="Opera",dt="Firefox",ut="Safari",ft=e=>{const t=e.current,o=e.version,n=e=>()=>t===e;return{current:t,version:o,isEdge:n(ct),isChromium:n(it),isIE:n("IE"),isOpera:n(mt),isFirefox:n(dt),isSafari:n(ut)}},gt=()=>ft({current:void 0,version:tt.unknown()}),ht=ft,pt=(g(ct),g(it),g("IE"),g(mt),g(dt),g(ut),"Windows"),bt="Android",wt="Linux",vt="macOS",yt="Solaris",xt="FreeBSD",Ct="ChromeOS",St=e=>{const t=e.current,o=e.version,n=e=>()=>t===e;return{current:t,version:o,isWindows:n(pt),isiOS:n("iOS"),isAndroid:n(bt),isMacOS:n(vt),isLinux:n(wt),isSolaris:n(yt),isFreeBSD:n(xt),isChromeOS:n(Ct)}},Tt=()=>St({current:void 0,version:tt.unknown()}),Rt=St,Dt=(g(pt),g("iOS"),g(bt),g(wt),g(vt),g(yt),g(xt),g(Ct),e=>window.matchMedia(e).matches);let Ot=ye((()=>((e,t,o)=>{const n=at.browsers(),r=at.oses(),s=t.bind((e=>((e,t)=>V(t.brands,(t=>{const o=t.brand.toLowerCase();return L(e,(e=>{var t;return o===(null===(t=e.brand)||void 0===t?void 0:t.toLowerCase())})).map((e=>({current:e.name,version:tt.nu(parseInt(t.version,10),0)})))})))(n,e))).orThunk((()=>((e,t)=>ot(e,t).map((e=>{const o=tt.detect(e.versionRegexes,t);return{current:e.name,version:o}})))(n,e))).fold(gt,ht),l=((e,t)=>ot(e,t).map((e=>{const o=tt.detect(e.versionRegexes,t);return{current:e.name,version:o}})))(r,e).fold(Tt,Rt),a=((e,t,o,n)=>{const r=e.isiOS()&&!0===/ipad/i.test(o),s=e.isiOS()&&!r,l=e.isiOS()||e.isAndroid(),a=l||n("(pointer:coarse)"),c=r||!s&&l&&n("(min-device-width:768px)"),i=s||l&&!c,m=t.isSafari()&&e.isiOS()&&!1===/safari/i.test(o),d=!i&&!c&&!m;return{isiPad:g(r),isiPhone:g(s),isTablet:g(c),isPhone:g(i),isTouch:g(a),isAndroid:e.isAndroid,isiOS:e.isiOS,isWebView:g(m),isDesktop:g(d)}})(l,s,e,o);return{browser:s,os:l,deviceType:a}})(window.navigator.userAgent,C.from(window.navigator.userAgentData),Dt)));const kt=()=>Ot(),Et=Object.getPrototypeOf,Nt=e=>{const t=ue("ownerDocument.defaultView",e);return s(e)&&((e=>((e,t)=>{const o=((e,t)=>ue(e,t))(e,t);if(null==o)throw new Error(e+" not available on this browser");return o})("HTMLElement",e))(t).prototype.isPrototypeOf(e)||/^HTML\w*Element$/.test(Et(e).constructor.name))},Bt=e=>e.dom.nodeName.toLowerCase(),_t=e=>e.dom.nodeType,zt=e=>t=>_t(t)===e,At=e=>8===_t(e)||"#comment"===Bt(e),Lt=e=>Mt(e)&&Nt(e.dom),Mt=zt(1),Wt=zt(3),jt=zt(9),Pt=zt(11),It=e=>t=>Mt(t)&&Bt(t)===e,Ft=e=>Me.fromDom(e.dom.ownerDocument),Ht=e=>jt(e)?e:Ft(e),$t=e=>C.from(e.dom.parentNode).map(Me.fromDom),Vt=e=>C.from(e.dom.parentElement).map(Me.fromDom),qt=(e,t)=>{const o=d(t)?t:y;let n=e.dom;const r=[];for(;null!==n.parentNode&&void 0!==n.parentNode;){const e=n.parentNode,t=Me.fromDom(e);if(r.push(t),!0===o(t))break;n=e}return r},Ut=e=>C.from(e.dom.previousSibling).map(Me.fromDom),Gt=e=>C.from(e.dom.nextSibling).map(Me.fromDom),Kt=e=>E(e.dom.childNodes,Me.fromDom),Yt=(e,t)=>{const o=e.dom.childNodes;return C.from(o[t]).map(Me.fromDom)},Jt=e=>Pt(e)&&m(e.dom.host),Qt=e=>Me.fromDom(e.dom.getRootNode()),Xt=e=>Me.fromDom(e.dom.host),Zt=e=>{const t=Me.fromDom((e=>{if(m(e.target)){const t=Me.fromDom(e.target);if(Mt(t)&&m(t.dom.shadowRoot)&&e.composed&&e.composedPath){const t=e.composedPath();if(t)return H(t)}}return C.from(e.target)})(e).getOr(e.target)),o=()=>e.stopPropagation(),n=()=>e.preventDefault(),r=(s=n,l=o,(...e)=>s(l.apply(null,e)));var s,l;return((e,t,o,n,r,s,l)=>({target:e,x:t,y:o,stop:n,prevent:r,kill:s,raw:l}))(t,e.clientX,e.clientY,o,n,r,e)},eo=(e,t,o,n)=>{e.dom.removeEventListener(t,o,n)},to=x,oo=(e,t,o)=>((e,t,o,n)=>((e,t,o,n,r)=>{const s=((e,t)=>o=>{e(o)&&t(Zt(o))})(o,n);return e.dom.addEventListener(t,s,r),{unbind:b(eo,e,t,s,r)}})(e,t,o,n,!1))(e,t,to,o),no=Zt,ro=(e,t)=>{$t(e).each((o=>{o.dom.insertBefore(t.dom,e.dom)}))},so=(e,t)=>{Gt(e).fold((()=>{$t(e).each((e=>{ao(e,t)}))}),(e=>{ro(e,t)}))},lo=(e,t)=>{const o=(e=>Yt(e,0))(e);o.fold((()=>{ao(e,t)}),(o=>{e.dom.insertBefore(t.dom,o.dom)}))},ao=(e,t)=>{e.dom.appendChild(t.dom)},co=(e,t)=>{ro(e,t),ao(t,e)},io=(e,t)=>{N(t,((o,n)=>{const r=0===n?e:t[n-1];so(r,o)}))},mo=(e,t)=>{N(t,(t=>{ao(e,t)}))},uo=(e,t,o)=>{if(!(r(o)||c(o)||u(o)))throw console.error("Invalid call to Attribute.set. Key ",t,":: Value ",o,":: Element ",e),new Error("Attribute value was not simple");e.setAttribute(t,o+"")},fo=(e,t,o)=>{uo(e.dom,t,o)},go=(e,t)=>{const o=e.dom;G(t,((e,t)=>{uo(o,t,e)}))},ho=(e,t)=>{const o=e.dom.getAttribute(t);return null===o?void 0:o},po=(e,t)=>C.from(ho(e,t)),bo=(e,t)=>{e.dom.removeAttribute(t)},wo=e=>A(e.dom.attributes,((e,t)=>(e[t.name]=t.value,e)),{}),vo=e=>{e.dom.textContent="",N(Kt(e),(e=>{yo(e)}))},yo=e=>{const t=e.dom;null!==t.parentNode&&t.parentNode.removeChild(t)},xo=e=>{const t=Kt(e);t.length>0&&io(e,t),yo(e)},Co=(e,t)=>Me.fromDom(e.dom.cloneNode(t)),So=e=>Co(e,!1),To=e=>Co(e,!0),Ro=(e,t)=>{const o=Me.fromTag(t),n=wo(e);return go(o,n),o},Do=e=>void 0!==e.style&&d(e.style.getPropertyValue),Oo=e=>{const t=Wt(e)?e.dom.parentNode:e.dom;if(null==t||null===t.ownerDocument)return!1;const o=t.ownerDocument;return(e=>{const t=Qt(e);return Jt(t)?C.some(t):C.none()})(Me.fromDom(t)).fold((()=>o.body.contains(t)),(n=Oo,r=Xt,e=>n(r(e))));var n,r},ko=(e,t,o)=>{if(!r(o))throw console.error("Invalid call to CSS.set. Property ",t,":: Value ",o,":: Element ",e),new Error("CSS value must be a string: "+o);Do(e)&&e.style.setProperty(t,o)},Eo=(e,t,o)=>{const n=e.dom;ko(n,t,o)},No=(e,t)=>{const o=e.dom;G(t,((e,t)=>{ko(o,t,e)}))},Bo=(e,t)=>{const o=e.dom,n=window.getComputedStyle(o).getPropertyValue(t);return""!==n||Oo(e)?n:_o(o,t)},_o=(e,t)=>Do(e)?e.style.getPropertyValue(t):"",zo=(e,t)=>{const o=e.dom,n=_o(o,t);return C.from(n).filter((e=>e.length>0))},Ao=(e,t)=>{((e,t)=>{Do(e)&&e.style.removeProperty(t)})(e.dom,t),ie(po(e,"style").map(we),"")&&bo(e,"style")},Lo=(e,t)=>{const o=o=>{const n=t(o);if(n<=0||null===n){const t=Bo(o,e);return parseFloat(t)||0}return n},n=(e,t)=>A(t,((t,o)=>{const n=Bo(e,o),r=void 0===n?0:parseInt(n,10);return isNaN(r)?t:t+r}),0);return{set:(t,o)=>{if(!u(o)&&!o.match(/^[0-9]+$/))throw new Error(e+".set accepts only positive integer values. Value was "+o);const n=t.dom;Do(n)&&(n.style[e]=o+"px")},get:o,getOuter:o,aggregate:n,max:(e,t,o)=>{const r=n(e,o);return t>r?t-r:0}}},Mo=(e,t,o)=>((e,t)=>(e=>{const t=parseFloat(e);return isNaN(t)?C.none():C.some(t)})(e).getOr(t))(Bo(e,t),o),Wo=Lo("height",(e=>{const t=e.dom;return Oo(e)?t.getBoundingClientRect().height:t.offsetHeight})),jo=e=>Wo.get(e),Po=e=>Wo.getOuter(e),Io=Lo("width",(e=>{const t=e.dom;return Oo(e)?t.getBoundingClientRect().width:t.offsetWidth})),Fo=e=>Io.get(e),Ho=e=>Io.getOuter(e),$o=e=>((e,t)=>{const o=e.dom,n=o.getBoundingClientRect().width||o.offsetWidth;return"border-box"===t?n:((e,t,o,n)=>t-Mo(e,`padding-${o}`,0)-Mo(e,`padding-${n}`,0)-Mo(e,`border-${o}-width`,0)-Mo(e,`border-${n}-width`,0))(e,n,"left","right")})(e,"content-box"),Vo=(e,t)=>({left:e,top:t,translate:(o,n)=>Vo(e+o,t+n)}),qo=Vo,Uo=(e,t)=>void 0!==e?e:void 0!==t?t:0,Go=e=>{const t=e.dom.ownerDocument,o=t.body,n=t.defaultView,r=t.documentElement;if(o===e.dom)return qo(o.offsetLeft,o.offsetTop);const s=Uo(null==n?void 0:n.pageYOffset,r.scrollTop),l=Uo(null==n?void 0:n.pageXOffset,r.scrollLeft),a=Uo(r.clientTop,o.clientTop),c=Uo(r.clientLeft,o.clientLeft);return Ko(e).translate(l-c,s-a)},Ko=e=>{const t=e.dom,o=t.ownerDocument.body;return o===t?qo(o.offsetLeft,o.offsetTop):Oo(e)?(e=>{const t=e.getBoundingClientRect();return qo(t.left,t.top)})(t):qo(0,0)},Yo=(e=>{const t=t=>e(t)?C.from(t.dom.nodeValue):C.none();return{get:o=>{if(!e(o))throw new Error("Can only get text value of a text node");return t(o).getOr("")},getOption:t,set:(t,o)=>{if(!e(t))throw new Error("Can only set raw text value of a text node");t.dom.nodeValue=o}}})(Wt),Jo=e=>Yo.get(e),Qo=e=>Yo.getOption(e),Xo=(e,t)=>Yo.set(e,t),Zo=(e,t)=>o=>"rtl"===en(o)?t:e,en=e=>"rtl"===Bo(e,"direction")?"rtl":"ltr";var tn=(e,t,o,n,r)=>e(o,n)?C.some(o):d(r)&&r(o)?C.none():t(o,n,r);const on=(e,t,o)=>{let n=e.dom;const r=d(o)?o:y;for(;n.parentNode;){n=n.parentNode;const e=Me.fromDom(n);if(t(e))return C.some(e);if(r(e))break}return C.none()},nn=(e,t,o)=>tn(((e,t)=>t(e)),on,e,t,o),rn=(e,t,o)=>on(e,(e=>Ge(e,t)),o),sn=(e,t)=>(e=>L(e.dom.childNodes,(e=>{return o=Me.fromDom(e),Ge(o,t);var o})).map(Me.fromDom))(e),ln=(e,t)=>Ye(t,e),an=(e,t,o)=>tn(((e,t)=>Ge(e,t)),rn,e,t,o),cn=e=>void 0!==e.dom.classList,mn=(e,t)=>((e,t,o)=>{const n=((e,t)=>{const o=ho(e,t);return void 0===o||""===o?[]:o.split(" ")})(e,t).concat([o]);return fo(e,t,n.join(" ")),!0})(e,"class",t),dn=(e,t)=>{cn(e)?e.dom.classList.add(t):mn(e,t)},un=(e,t)=>cn(e)&&e.dom.classList.contains(t),fn=e=>an(e,"[contenteditable]"),gn=(e,t=!1)=>Oo(e)?e.dom.isContentEditable:fn(e).fold(g(t),(e=>"true"===hn(e))),hn=e=>e.dom.contentEditable,pn=(e,t)=>{let o=[];return N(Kt(e),(e=>{t(e)&&(o=o.concat([e])),o=o.concat(pn(e,t))})),o},bn=(e,t,o)=>((e,o,n)=>_(qt(e,n),(e=>Ge(e,t))))(e,0,o),wn=(e,t)=>(e=>_(Kt(e),(e=>Ge(e,t))))(e),vn=(e,t)=>((e,t)=>{const o=void 0===t?document:t.dom;return Ke(o)?[]:E(o.querySelectorAll(e),Me.fromDom)})(t,e),yn=e=>"img"===Bt(e)?1:Qo(e).fold((()=>Kt(e).length),(e=>e.length)),xn=["img","br"],Cn=e=>Qo(e).filter((e=>0!==e.trim().length||e.indexOf("\xa0")>-1)).isSome()||D(xn,Bt(e))||(e=>Lt(e)&&"false"===ho(e,"contenteditable"))(e),Sn=e=>((e,t)=>{const o=e=>{for(let n=0;nRn(e,Cn),Rn=(e,t)=>{const o=e=>{const n=Kt(e);for(let e=n.length-1;e>=0;e--){const r=n[e];if(t(r))return C.some(r);const s=o(r);if(s.isSome())return s}return C.none()};return o(e)},Dn=(e,t,o,n)=>({start:e,soffset:t,finish:o,foffset:n}),On=Z([{before:["element"]},{on:["element","offset"]},{after:["element"]}]),kn={before:On.before,on:On.on,after:On.after,cata:(e,t,o,n)=>e.fold(t,o,n),getStart:e=>e.fold(h,h,h)},En=Z([{domRange:["rng"]},{relative:["startSitu","finishSitu"]},{exact:["start","soffset","finish","foffset"]}]),Nn={domRange:En.domRange,relative:En.relative,exact:En.exact,exactFromRange:e=>En.exact(e.start,e.soffset,e.finish,e.foffset),getWin:e=>{const t=(e=>e.match({domRange:e=>Me.fromDom(e.startContainer),relative:(e,t)=>kn.getStart(e),exact:(e,t,o,n)=>e}))(e);return Me.fromDom(Ht(t).dom.defaultView)},range:Dn},Bn=(e,t)=>{const o=Bt(e);return"input"===o?kn.after(e):D(["br","img"],o)?0===t?kn.before(e):kn.after(e):kn.on(e,t)},_n=e=>C.from(e.getSelection()),zn=(e,t)=>{_n(e).each((e=>{e.removeAllRanges(),e.addRange(t)}))},An=(e,t,o,n,r)=>{const s=Fe(e,t,o,n,r);zn(e,s)},Ln=(e,t)=>qe(e,t).match({ltr:(t,o,n,r)=>{An(e,t,o,n,r)},rtl:(t,o,n,r)=>{_n(e).each((s=>{if(s.setBaseAndExtent)s.setBaseAndExtent(t.dom,o,n.dom,r);else if(s.extend)try{((e,t,o,n,r,s)=>{t.collapse(o.dom,n),t.extend(r.dom,s)})(0,s,t,o,n,r)}catch(s){An(e,n,r,t,o)}else An(e,n,r,t,o)}))}}),Mn=(e,t,o,n,r)=>{const s=((e,t,o,n)=>{const r=Bn(e,t),s=Bn(o,n);return Nn.relative(r,s)})(t,o,n,r);Ln(e,s)},Wn=(e,t,o)=>{const n=((e,t)=>{const o=e.fold(kn.before,Bn,kn.after),n=t.fold(kn.before,Bn,kn.after);return Nn.relative(o,n)})(t,o);Ln(e,n)},jn=e=>{if(e.rangeCount>0){const t=e.getRangeAt(0),o=e.getRangeAt(e.rangeCount-1);return C.some(Dn(Me.fromDom(t.startContainer),t.startOffset,Me.fromDom(o.endContainer),o.endOffset))}return C.none()},Pn=e=>{if(null===e.anchorNode||null===e.focusNode)return jn(e);{const t=Me.fromDom(e.anchorNode),o=Me.fromDom(e.focusNode);return((e,t,o,n)=>{const r=((e,t,o,n)=>{const r=Ft(e).dom.createRange();return r.setStart(e.dom,t),r.setEnd(o.dom,n),r})(e,t,o,n),s=Je(e,o)&&t===n;return r.collapsed&&!s})(t,e.anchorOffset,o,e.focusOffset)?C.some(Dn(t,e.anchorOffset,o,e.focusOffset)):jn(e)}},In=(e,t,o=!0)=>{const n=(o?je:We)(e,t);zn(e,n)},Fn=e=>(e=>_n(e).filter((e=>e.rangeCount>0)).bind(Pn))(e).map((e=>Nn.exact(e.start,e.soffset,e.finish,e.foffset))),Hn=(e,t,o)=>((e,t,o)=>((e,t,o)=>e.caretPositionFromPoint?((e,t,o)=>{var n;return C.from(null===(n=e.caretPositionFromPoint)||void 0===n?void 0:n.call(e,t,o)).bind((t=>{if(null===t.offsetNode)return C.none();const o=e.createRange();return o.setStart(t.offsetNode,t.offset),o.collapse(),C.some(o)}))})(e,t,o):e.caretRangeFromPoint?((e,t,o)=>{var n;return C.from(null===(n=e.caretRangeFromPoint)||void 0===n?void 0:n.call(e,t,o))})(e,t,o):C.none())(e.document,t,o).map((e=>Dn(Me.fromDom(e.startContainer),e.startOffset,Me.fromDom(e.endContainer),e.endOffset))))(e,t,o),$n={unsupportedLength:["em","ex","cap","ch","ic","rem","lh","rlh","vw","vh","vi","vb","vmin","vmax","cm","mm","Q","in","pc","pt","px"],fixed:["px","pt"],relative:["%"],empty:[""]},Vn=(()=>{const e="[0-9]+",t="[eE][+-]?"+e,o=e=>`(?:${e})?`,n=["Infinity",e+"\\."+o(e)+o(t),"\\."+e+o(t),e+o(t)].join("|");return new RegExp(`^([+-]?(?:${n}))(.*)$`)})(),qn=e=>E(e,g(0)),Un=(e,t,o,n,r)=>r(e.slice(0,t)).concat(n).concat(r(e.slice(o))),Gn=e=>(t,o,n,r)=>{if(e(n)){const e=Math.max(r,t[o]-Math.abs(n)),s=Math.abs(e-t[o]);return n>=0?s:-s}return n},Kn=Gn((e=>e<0)),Yn=Gn(x),Jn=()=>{const e=(e,t,o,n)=>{const r=(100+o)/100,s=Math.max(n,(e[t]+o)/r);return E(e,((e,o)=>(o===t?s:e/r)-e))},t=(t,o,n,r,s,l)=>l?e(t,o,r,s):((e,t,o,n,r)=>{const s=Kn(e,t,n,r);return Un(e,t,o+1,[s,0],qn)})(t,o,n,r,s);return{resizeTable:(e,t)=>e(t),clampTableDelta:Kn,calcLeftEdgeDeltas:t,calcMiddleDeltas:(e,o,n,r,s,l,a)=>t(e,n,r,s,l,a),calcRightEdgeDeltas:(t,o,n,r,s,l)=>{if(l)return e(t,n,r,s);{const e=Kn(t,n,r,s);return qn(t.slice(0,n)).concat([e])}},calcRedestributedWidths:(e,t,o,n)=>{if(n){const n=(t+o)/t,r=E(e,(e=>e/n));return{delta:100*n-100,newSizes:r}}return{delta:o,newSizes:e}}}},Qn=()=>{const e=(e,t,o,n,r)=>{const s=Yn(e,n>=0?o:t,n,r);return Un(e,t,o+1,[s,-s],qn)};return{resizeTable:(e,t,o)=>{o&&e(t)},clampTableDelta:(e,t,o,n,r)=>{if(r){if(o>=0)return o;{const t=A(e,((e,t)=>e+t-n),0);return Math.max(-t,o)}}return Kn(e,t,o,n)},calcLeftEdgeDeltas:e,calcMiddleDeltas:(t,o,n,r,s,l)=>e(t,n,r,s,l),calcRightEdgeDeltas:(e,t,o,n,r,s)=>{if(s)return qn(e);{const t=n/e.length;return E(e,g(t))}},calcRedestributedWidths:(e,t,o,n)=>({delta:0,newSizes:e})}},Xn=(e,t,o=0)=>po(e,t).map((e=>parseInt(e,10))).getOr(o),Zn=(e,t)=>Xn(e,t,1),er=e=>It("col")(e)?Xn(e,"span",1)>1:Zn(e,"colspan")>1,tr=(e,t)=>parseInt(Bo(e,t),10),or=g(10),nr=g(10),rr=(e,t)=>sr(e,t,x),sr=(e,t,o)=>j(Kt(e),(e=>Ge(e,t)?o(e)?[e]:[]:sr(e,t,o))),lr=(e,t)=>((e,t,o=y)=>o(t)?C.none():D(e,Bt(t))?C.some(t):rn(t,e.join(","),(e=>Ge(e,"table")||o(e))))(["td","th"],e,t),ar=e=>rr(e,"th,td"),cr=e=>Ge(e,"colgroup")?wn(e,"col"):j(dr(e),(e=>wn(e,"col"))),ir=(e,t)=>an(e,"table",t),mr=e=>rr(e,"tr"),dr=e=>ir(e).fold(g([]),(e=>wn(e,"colgroup"))),ur=It("th"),fr=e=>P(e,(e=>ur(e.element))),gr=(e,t)=>e&&t?"sectionCells":e?"section":"cells",hr=e=>{const t="thead"===e.section,o=ie(pr(e.cells),"th");return"tfoot"===e.section?{type:"footer"}:t||o?{type:"header",subType:gr(t,o)}:{type:"body"}},pr=e=>{const t=_(e,(e=>ur(e.element)));return 0===t.length?C.some("td"):t.length===e.length?C.some("th"):C.none()},br=(e,t)=>E(e,(e=>{if("colgroup"===Bt(e)){const t=E(cr(e),(e=>{const t=Xn(e,"span",1);return Ce(e,1,t)}));return Se(e,t,"colgroup")}{const o=E(ar(e),(e=>{const t=Xn(e,"rowspan",1),o=Xn(e,"colspan",1);return Ce(e,t,o)}));return Se(e,o,t(e))}})),wr=e=>$t(e).map((e=>{const t=Bt(e);return(e=>D(xe,e))(t)?t:"tbody"})).getOr("tbody"),vr=e=>{const t=mr(e),o=[...dr(e),...t];return br(o,wr)},yr="data-snooker-locked-cols",xr=e=>po(e,yr).bind((e=>C.from(e.match(/\d+/g)))).map((e=>I(e,x))),Cr=e=>{const t=A(ze(e).rows,((e,t)=>(N(t.cells,((t,o)=>{t.isLocked&&(e[o]=!0)})),e)),{}),o=J(t,((e,t)=>parseInt(t,10)));return(e=>{const t=S.call(e,0);return t.sort(void 0),t})(o)},Sr=(e,t)=>e+","+t,Tr=(e,t)=>{const o=j(e.all,(e=>e.cells));return _(o,t)},Rr=e=>{const t={},o=[],n=H(e).map((e=>e.element)).bind(ir).bind(xr).getOr({});let r=0,s=0,l=0;const{pass:a,fail:c}=B(e,(e=>"colgroup"===e.section));N(c,(e=>{const a=[];N(e.cells,(e=>{let o=0;for(;void 0!==t[Sr(l,o)];)o++;const r=((e,t)=>X(e,t)&&void 0!==e[t]&&null!==e[t])(n,o.toString()),c=((e,t,o,n,r,s)=>({element:e,rowspan:t,colspan:o,row:n,column:r,isLocked:s}))(e.element,e.rowspan,e.colspan,l,o,r);for(let n=0;n{const t=(e=>{const t={};let o=0;return N(e.cells,(e=>{const n=e.colspan;k(n,(r=>{const s=o+r;t[s]=((e,t,o)=>({element:e,colspan:t,column:o}))(e.element,n,s)})),o+=n})),t})(e),o=((e,t)=>({element:e,columns:t}))(e.element,Q(t));return{colgroups:[o],columns:t}})).getOrThunk((()=>({colgroups:[],columns:{}}))),d=((e,t)=>({rows:e,columns:t}))(r,s);return{grid:d,access:t,all:o,columns:i,colgroups:m}},Dr=e=>{const t=vr(e);return Rr(t)},Or=Rr,kr=(e,t,o)=>C.from(e.access[Sr(t,o)]),Er=(e,t,o)=>{const n=Tr(e,(e=>o(t,e.element)));return n.length>0?C.some(n[0]):C.none()},Nr=Tr,Br=e=>j(e.all,(e=>e.cells)),_r=e=>Q(e.columns),zr=e=>q(e.columns).length>0,Ar=(e,t)=>C.from(e.columns[t]),Lr=(e,t,o)=>Te(o(e.element,t),!0,e.isLocked),Mr=(e,t)=>e.section!==t?Re(e.element,e.cells,t,e.isNew):e,Wr=()=>({transformRow:Mr,transformCell:(e,t,o)=>{const n=o(e.element,t),r="td"!==Bt(n)?(e=>{const t=Ro(e,"td");so(e,t);const o=Kt(e);return mo(t,o),yo(e),t})(n):n;return Te(r,e.isNew,e.isLocked)}}),jr=()=>({transformRow:Mr,transformCell:Lr}),Pr=()=>({transformRow:(e,t)=>Mr(e,"thead"===t?"tbody":t),transformCell:Lr}),Ir=Wr,Fr=jr,Hr=Pr,$r=()=>({transformRow:h,transformCell:Lr}),Vr=(e,t=x)=>{const o=e.grid,n=k(o.columns,h),r=k(o.rows,h);return E(n,(o=>qr((()=>j(r,(t=>kr(e,t,o).filter((e=>e.column===o)).toArray()))),(e=>1===e.colspan&&t(e.element)),(()=>kr(e,0,o)))))},qr=(e,t,o)=>{const n=e();return L(n,t).orThunk((()=>C.from(n[0]).orThunk(o))).map((e=>e.element))},Ur=e=>{const t=e.grid,o=k(t.rows,h),n=k(t.columns,h);return E(o,(t=>qr((()=>j(n,(o=>kr(e,t,o).filter((e=>e.row===t)).fold(g([]),(e=>[e]))))),(e=>1===e.rowspan),(()=>kr(e,t,0)))))},Gr=(e,t)=>({row:e,y:t}),Kr=(e,t)=>({col:e,x:t}),Yr=e=>Go(e).left+Ho(e),Jr=e=>Go(e).left,Qr=(e,t)=>Kr(e,Jr(t)),Xr=(e,t)=>Kr(e,Yr(t)),Zr=e=>Go(e).top,es=(e,t)=>Gr(e,Zr(t)),ts=(e,t)=>Gr(e,Zr(t)+Po(t)),os=(e,t,o)=>{if(0===o.length)return[];const n=E(o.slice(1),((t,o)=>t.map((t=>e(o,t))))),r=o[o.length-1].map((e=>t(o.length-1,e)));return n.concat([r])},ns={delta:h,positions:e=>os(es,ts,e),edge:Zr},rs=Zo({delta:h,edge:Jr,positions:e=>os(Qr,Xr,e)},{delta:e=>-e,edge:Yr,positions:e=>os(Xr,Qr,e)}),ss={delta:(e,t)=>rs(t).delta(e,t),positions:(e,t)=>rs(t).positions(e,t),edge:e=>rs(e).edge(e)},ls=/(\d+(\.\d+)?)%/,as=/(\d+(\.\d+)?)px|em/,cs=It("col"),is=It("tr"),ms=(e,t,o)=>{const n=Vt(e).getOrThunk((()=>(e=>{const t=e.dom.body;if(null==t)throw new Error("Body is not available yet");return Me.fromDom(t)})(Ft(e))));return t(e)/o(n)*100},ds=(e,t)=>{Eo(e,"width",t+"px")},us=(e,t)=>{Eo(e,"width",t+"%")},fs=(e,t)=>{Eo(e,"height",t+"px")},gs=e=>{const t=(e=>{return Mo(t=e,"height",t.dom.offsetHeight)+"px";var t})(e);return t?((e,t,o,n)=>{const r=parseFloat(e);return be(e,"%")&&"table"!==Bt(t)?((e,t,o,n)=>{const r=ir(e).map((e=>{const n=o(e);return Math.floor(t/100*n)})).getOr(t);return n(e,r),r})(t,r,o,n):r})(t,e,jo,fs):jo(e)},hs=(e,t)=>zo(e,t).orThunk((()=>po(e,t).map((e=>e+"px")))),ps=e=>hs(e,"width"),bs=e=>ms(e,Fo,$o),ws=e=>{return cs(e)?Math.round(Fo(e)):Mo(t=e,"width",t.dom.offsetWidth);var t},vs=e=>is(e)?jo(e):((e,t,o)=>o(e)/Zn(e,"rowspan"))(e,0,gs),ys=(e,t,o)=>{Eo(e,"width",t+o)},xs=e=>ms(e,Fo,$o)+"%",Cs=g(ls),Ss=It("col"),Ts=e=>ps(e).getOrThunk((()=>ws(e)+"px")),Rs=e=>{return(t=e,hs(t,"height")).getOrThunk((()=>vs(e)+"px"));var t},Ds=(e,t,o,n,r,s)=>e.filter(n).fold((()=>s(((e,t)=>{if(t<0||t>=e.length-1)return C.none();const o=e[t].fold((()=>{const o=(e=>{const t=S.call(e,0);return t.reverse(),t})(e.slice(0,t));return V(o,((e,t)=>e.map((e=>({value:e,delta:t+1})))))}),(e=>C.some({value:e,delta:0}))),n=e[t+1].fold((()=>{const o=e.slice(t+1);return V(o,((e,t)=>e.map((e=>({value:e,delta:t+1})))))}),(e=>C.some({value:e,delta:1})));return o.bind((e=>n.map((t=>{const o=t.delta+e.delta;return Math.abs(t.value-e.value)/o}))))})(o,t))),(e=>r(e))),Os=(e,t,o,n)=>{const r=Vr(e),s=zr(e)?(e=>E(_r(e),(e=>C.from(e.element))))(e):r,l=[C.some(ss.edge(t))].concat(E(ss.positions(r,t),(e=>e.map((e=>e.x))))),a=w(er);return E(s,((e,t)=>Ds(e,t,l,a,(e=>{if((e=>{const t=kt().browser,o=t.isChromium()||t.isFirefox();return!Ss(e)||o})(e))return o(e);{const e=null!=(s=r[t])?h(s):C.none();return Ds(e,t,l,a,(e=>n(C.some(Math.round(Fo(e))))),n)}var s}),n)))},ks=e=>e.map((e=>e+"px")).getOr(""),Es=(e,t,o)=>Os(e,t,ws,(e=>e.getOrThunk(o.minCellWidth))),Ns=(e,t,o,n)=>{const r=Ur(e),s=E(e.all,(e=>C.some(e.element))),l=[C.some(ns.edge(t))].concat(E(ns.positions(r,t),(e=>e.map((e=>e.y)))));return E(s,((e,t)=>Ds(e,t,l,x,o,n)))},Bs=(e,t)=>()=>Oo(e)?t(e):parseFloat(zo(e,"width").getOr("0")),_s=e=>{const t=Bs(e,(e=>parseFloat(xs(e)))),o=Bs(e,Fo);return{width:t,pixelWidth:o,getWidths:(t,o)=>((e,t,o)=>Os(e,t,bs,(e=>e.fold((()=>o.minCellWidth()),(e=>e/o.pixelWidth()*100)))))(t,e,o),getCellDelta:e=>e/o()*100,singleColumnWidth:(e,t)=>[100-e],minCellWidth:()=>or()/o()*100,setElementWidth:us,adjustTableWidth:o=>{const n=t();us(e,n+o/100*n)},isRelative:!0,label:"percent"}},zs=e=>{const t=Bs(e,Fo);return{width:t,pixelWidth:t,getWidths:(t,o)=>Es(t,e,o),getCellDelta:h,singleColumnWidth:(e,t)=>[Math.max(or(),e+t)-e],minCellWidth:or,setElementWidth:ds,adjustTableWidth:o=>{const n=t()+o;ds(e,n)},isRelative:!1,label:"pixel"}},As=e=>ps(e).fold((()=>(e=>{const t=Bs(e,Fo),o=g(0);return{width:t,pixelWidth:t,getWidths:(t,o)=>Es(t,e,o),getCellDelta:o,singleColumnWidth:g([0]),minCellWidth:o,setElementWidth:f,adjustTableWidth:f,isRelative:!0,label:"none"}})(e)),(t=>((e,t)=>null!==Cs().exec(t)?_s(e):zs(e))(e,t))),Ls=zs,Ms=_s,Ws=(e,t,o,n)=>{o===n?bo(e,t):fo(e,t,o)},js=(e,t,o)=>{$(wn(e,t)).fold((()=>lo(e,o)),(e=>so(e,o)))},Ps=(e,t)=>{const o=[],n=[],r=e=>E(e,(e=>{e.isNew&&o.push(e.element);const t=e.element;return vo(t),N(e.cells,(e=>{e.isNew&&n.push(e.element),Ws(e.element,"colspan",e.colspan,1),Ws(e.element,"rowspan",e.rowspan,1),ao(t,e.element)})),t})),s=e=>j(e,(e=>E(e.cells,(e=>(Ws(e.element,"span",e.colspan,1),e.element))))),l=(t,o)=>{const n=((e,t)=>{const o=sn(e,t).getOrThunk((()=>{const o=Me.fromTag(t,Ft(e).dom);return"thead"===t?js(e,"caption,colgroup",o):"colgroup"===t?js(e,"caption",o):ao(e,o),o}));return vo(o),o})(e,o),l=("colgroup"===o?s:r)(t);mo(n,l)},a=(t,o)=>{t.length>0?l(t,o):(t=>{sn(e,t).each(yo)})(o)},c=[],i=[],m=[],d=[];return N(t,(e=>{switch(e.section){case"thead":c.push(e);break;case"tbody":i.push(e);break;case"tfoot":m.push(e);break;case"colgroup":d.push(e)}})),a(d,"colgroup"),a(c,"thead"),a(i,"tbody"),a(m,"tfoot"),{newRows:o,newCells:n}},Is=(e,t)=>{if(0===e.length)return 0;const o=e[0];return M(e,(e=>!t(o.element,e.element))).getOr(e.length)},Fs=(e,t)=>{const o=E(e,(e=>E(e.cells,y)));return E(e,((n,r)=>{const s=j(n.cells,((n,s)=>{if(!1===o[r][s]){const m=((e,t,o,n)=>{const r=((e,t)=>e[t])(e,t),s="colgroup"===r.section,l=Is(r.cells.slice(o),n),a=s?1:Is(((e,t)=>E(e,(e=>Ne(e,t))))(e.slice(t),o),n);return{colspan:l,rowspan:a}})(e,r,s,t);return((e,t,n,r)=>{for(let s=e;s({element:e,cells:t,section:o,isNew:n}))(n.element,s,n.section,n.isNew)}))},Hs=(e,t,o)=>{const n=[];N(e.colgroups,(r=>{const s=[];for(let n=0;nTe(e.element,o,!1))).getOrThunk((()=>Te(t.colGap(),!0,!1)));s.push(r)}n.push(Re(r.element,s,"colgroup",o))}));for(let r=0;rTe(e.element,o,e.isLocked))).getOrThunk((()=>Te(t.gap(),!0,!1)));s.push(l)}const l=e.all[r],a=Re(l.element,s,l.section,o);n.push(a)}return n},$s=e=>Fs(e,Je),Vs=(e,t)=>V(e.all,(e=>L(e.cells,(e=>Je(t,e.element))))),qs=(e,t,o)=>{const n=E(t.selection,(t=>lr(t).bind((t=>Vs(e,t))).filter(o))),r=me(n);return de(r.length>0,r)},Us=(e,t,o,n,r,s,l,a,c)=>{const i=Dr(s),m=C.from(null==c?void 0:c.section).getOrThunk($r);return t(i,l).map((t=>{const o=((e,t)=>Hs(e,t,!1))(i,a),n=e(o,t,Je,r(a),m),s=Cr(n.grid);return{info:t,grid:$s(n.grid),cursor:n.cursor,lockedColumns:s}})).bind((e=>{const t=Ps(s,e.grid),r=C.from(null==c?void 0:c.sizing).getOrThunk((()=>As(s))),l=C.from(null==c?void 0:c.resize).getOrThunk(Qn);return o(s,e.grid,e.info,{sizing:r,resize:l,section:m}),n(s),bo(s,yr),e.lockedColumns.length>0&&fo(s,yr,e.lockedColumns.join(",")),C.some({cursor:e.cursor,newRows:t.newRows,newCells:t.newCells})}))},Gs=(e,t)=>lr(t.element).bind((o=>Vs(e,o).map((e=>({...e,generators:t.generators,clipboard:t.clipboard}))))),Ks=(e,t)=>qs(e,t,x).map((e=>({cells:e,generators:t.generators,clipboard:t.clipboard}))),Ys=(e,t)=>qs(e,t,x),Js=(e,t)=>qs(e,t,(e=>!e.isLocked)),Qs=(e,t)=>P(t,(t=>((e,t)=>Vs(e,t).exists((e=>!e.isLocked)))(e,t))),Xs=(e,t)=>((e,t)=>t.mergable)(0,t).filter((t=>Qs(e,t.cells))),Zs=(e,t)=>((e,t)=>t.unmergable)(0,t).filter((t=>Qs(e,t))),el={...Z([{none:[]},{only:["index"]},{left:["index","next"]},{middle:["prev","index","next"]},{right:["prev","index"]}])},tl=(e,t,o)=>{const n=((e,t)=>zr(e)?((e,t)=>{const o=_r(e);return E(o,((e,o)=>({element:e.element,width:t[o],colspan:e.colspan})))})(e,t):((e,t)=>{const o=Br(e);return E(o,(e=>{const o=((e,t,o)=>{let n=0;for(let r=e;r{o.setElementWidth(e.element,e.width)}))},ol=(e,t,o,n,r)=>{const s=Dr(e),l=r.getCellDelta(t),a=r.getWidths(s,r),c=o===s.grid.columns-1,i=n.clampTableDelta(a,o,l,r.minCellWidth(),c),m=((e,t,o,n,r)=>{const s=e.slice(0),l=((e,t)=>0===e.length?el.none():1===e.length?el.only(0):0===t?el.left(0,1):t===e.length-1?el.right(t-1,t):t>0&&tn.singleColumnWidth(s[e],o)),((e,t)=>r.calcLeftEdgeDeltas(s,e,t,o,n.minCellWidth(),n.isRelative)),((e,t,l)=>r.calcMiddleDeltas(s,e,t,l,o,n.minCellWidth(),n.isRelative)),((e,t)=>r.calcRightEdgeDeltas(s,e,t,o,n.minCellWidth(),n.isRelative)))})(a,o,i,r,n),d=E(m,((e,t)=>e+a[t]));tl(s,d,r),n.resizeTable(r.adjustTableWidth,i,c)},nl=(e,t,o)=>{const n=Dr(e),r=((e,t)=>Ns(e,t,vs,(e=>e.getOrThunk(nr))))(n,e),s=E(r,((e,n)=>o===n?Math.max(t+e,nr()):e)),l=((e,t)=>E(e.all,((e,o)=>({element:e.element,height:t[o]}))))(n,s);N(l,(e=>{fs(e.element,e.height)})),N(Br(n),(e=>{(e=>{Ao(e,"height")})(e.element)}));const a=z(s,((e,t)=>e+t),0);fs(e,a)},rl=(e,t)=>{if(!er(e)){const o=(e=>ps(e).bind((e=>{return t=e,o=["fixed","relative","empty"],C.from(Vn.exec(t)).bind((e=>{const t=Number(e[1]),n=e[2];return((e,t)=>O(t,(t=>O($n[t],(t=>e===t)))))(n,o)?C.some({value:t,unit:n}):C.none()}));var t,o})))(e);o.each((o=>{const n=o.value/2;ys(e,n,o.unit),ys(t,n,o.unit)}))}},sl=(e,t,o)=>{const n=Xn(e,t,1);1===o||n<=1?bo(e,t):fo(e,t,Math.min(o,n))},ll=(e,t)=>o=>{const n=o.column+o.colspan-1,r=o.column;return n>=e&&r{const n=e[o].element,r=Me.fromTag("td");ao(r,Me.fromTag("br")),(t?ao:lo)(n,r)},cl=It("col"),il=It("colgroup"),ml=e=>"tr"===Bt(e)||il(e),dl=e=>({element:e,colspan:Xn(e,"colspan",1),rowspan:Xn(e,"rowspan",1)}),ul=e=>po(e,"scope").map((e=>e.substr(0,3))),fl=(e,t=dl)=>{const o=o=>{if(ml(o))return il((r={element:o}).element)?e.colgroup(r):e.row(r);{const r=o,s=(t=>cl(t.element)?e.col(t):e.cell(t))(t(r));return n=C.some({item:r,replacement:s}),s}var r};let n=C.none();return{getOrInit:(e,t)=>n.fold((()=>o(e)),(n=>t(e,n.item)?n.replacement:o(e)))}},gl=e=>t=>{const o=[],n=n=>{const r="td"===e?{scope:null}:{},s=t.replace(n,e,r);return o.push({item:n,sub:s}),s};return{replaceOrInit:(e,t)=>{if(ml(e)||cl(e))return e;{const r=e;return((e,t)=>L(o,(o=>t(o.item,e))))(r,t).fold((()=>n(r)),(o=>t(e,o.item)?o.sub:n(r)))}}}},hl=e=>({unmerge:t=>{const o=ul(t);return o.each((e=>fo(t,"scope",e))),()=>{const n=e.cell({element:t,colspan:1,rowspan:1});return Ao(n,"width"),Ao(t,"width"),o.each((e=>fo(n,"scope",e))),n}},merge:e=>(Ao(e[0],"width"),(()=>{const t=me(E(e,ul));if(0===t.length)return C.none();{const e=t[0],o=["row","col"];return O(t,(t=>t!==e&&D(o,t)))?C.none():C.from(e)}})().fold((()=>bo(e[0],"scope")),(t=>fo(e[0],"scope",t+"group"))),g(e[0]))}),pl=Z([{invalid:["raw"]},{pixels:["value"]},{percent:["value"]}]),bl=(e,t,o)=>{const n=o.substring(0,o.length-e.length),r=parseFloat(n);return n===r.toString()?t(r):pl.invalid(o)},wl={...pl,from:e=>be(e,"%")?bl("%",pl.percent,e):be(e,"px")?bl("px",pl.pixels,e):pl.invalid(e)},vl=(e,t,o)=>{const n=wl.from(o),r=P(e,(e=>"0px"===e))?((e,t)=>{const o=e.fold((()=>g("")),(e=>g(e/t+"px")),(()=>g(100/t+"%")));return k(t,o)})(n,e.length):((e,t,o)=>e.fold((()=>t),(e=>((e,t,o)=>{const n=o/t;return E(e,(e=>wl.from(e).fold((()=>e),(e=>e*n+"px"),(e=>e/100*o+"px"))))})(t,o,e)),(e=>((e,t)=>E(e,(e=>wl.from(e).fold((()=>e),(e=>e/t*100+"%"),(e=>e+"%")))))(t,o))))(n,e,t);return Cl(r)},yl=(e,t)=>0===e.length?t:z(e,((e,t)=>wl.from(t).fold(g(0),h,h)+e),0),xl=(e,t)=>wl.from(e).fold(g(e),(e=>e+t+"px"),(e=>e+t+"%")),Cl=e=>{if(0===e.length)return e;const t=z(e,((e,t)=>{const o=wl.from(t).fold((()=>({value:t,remainder:0})),(e=>(e=>{const t=Math.floor(e);return{value:t+"px",remainder:e-t}})(e)),(e=>({value:e+"%",remainder:0})));return{output:[o.value].concat(e.output),remainder:e.remainder+o.remainder}}),{output:[],remainder:0}),o=t.output;return o.slice(0,o.length-1).concat([xl(o[o.length-1],Math.round(t.remainder))])},Sl=wl.from,Tl=(e,t,o)=>{const n=Dr(e),r=n.all,s=Br(n),l=_r(n);t.each((t=>{const o=Sl(t).fold(g("px"),g("px"),g("%")),r=Fo(e),a=((e,t)=>Os(e,t,Ts,ks))(n,e),c=vl(a,r,t);zr(n)?((e,t,o)=>{N(t,((t,n)=>{const r=yl([e[n]],or());Eo(t.element,"width",r+o)}))})(c,l,o):((e,t,o)=>{N(t,(t=>{const n=e.slice(t.column,t.colspan+t.column),r=yl(n,or());Eo(t.element,"width",r+o)}))})(c,s,o),Eo(e,"width",t)})),o.each((t=>{const o=jo(e),l=((e,t)=>Ns(e,t,Rs,ks))(n,e);((e,t,o)=>{N(o,(e=>{Ao(e.element,"height")})),N(t,((t,o)=>{Eo(t.element,"height",e[o])}))})(vl(l,o,t),r,s),Eo(e,"height",t)}))},Rl=e=>ps(e).exists((e=>ls.test(e))),Dl=e=>ps(e).exists((e=>as.test(e))),Ol=e=>ps(e).isNone();var kl=["body","p","div","article","aside","figcaption","figure","footer","header","nav","section","ol","ul","li","table","thead","tbody","tfoot","caption","tr","td","th","h1","h2","h3","h4","h5","h6","blockquote","pre","address"],El=()=>({up:g({selector:rn,closest:an,predicate:on,all:qt}),down:g({selector:vn,predicate:pn}),styles:g({get:Bo,getRaw:zo,set:Eo,remove:Ao}),attrs:g({get:ho,set:fo,remove:bo,copyTo:(e,t)=>{const o=wo(e);go(t,o)}}),insert:g({before:ro,after:so,afterAll:io,append:ao,appendAll:mo,prepend:lo,wrap:co}),remove:g({unwrap:xo,remove:yo}),create:g({nu:Me.fromTag,clone:e=>Me.fromDom(e.dom.cloneNode(!1)),text:Me.fromText}),query:g({comparePosition:(e,t)=>e.dom.compareDocumentPosition(t.dom),prevSibling:Ut,nextSibling:Gt}),property:g({children:Kt,name:Bt,parent:$t,document:e=>Ht(e).dom,isText:Wt,isComment:At,isElement:Mt,isSpecial:e=>{const t=Bt(e);return D(["script","noscript","iframe","noframes","noembed","title","style","textarea","xmp"],t)},getLanguage:e=>Mt(e)?po(e,"lang"):C.none(),getText:Jo,setText:Xo,isBoundary:e=>!!Mt(e)&&("body"===Bt(e)||D(kl,Bt(e))),isEmptyTag:e=>!!Mt(e)&&D(["br","img","hr","input"],Bt(e)),isNonEditable:e=>Mt(e)&&"false"===ho(e,"contenteditable")}),eq:Je,is:Xe});const Nl=(e,t)=>({item:e,mode:t}),Bl=(e,t,o,n=_l)=>e.property().parent(t).map((e=>Nl(e,n))),_l=(e,t,o,n=zl)=>o.sibling(e,t).map((e=>Nl(e,n))),zl=(e,t,o,n=zl)=>{const r=e.property().children(t);return o.first(r).map((e=>Nl(e,n)))},Al=[{current:Bl,next:_l,fallback:C.none()},{current:_l,next:zl,fallback:C.some(Bl)},{current:zl,next:zl,fallback:C.some(_l)}],Ll=(e,t,o,n,r=Al)=>L(r,(e=>e.current===o)).bind((o=>o.current(e,t,n,o.next).orThunk((()=>o.fallback.bind((o=>Ll(e,t,o,n))))))),Ml=(e,t,o,n,r,s)=>Ll(e,t,n,r).bind((t=>s(t.item)?C.none():o(t.item)?C.some(t.item):Ml(e,t.item,o,t.mode,r,s))),Wl=(e,t)=>({element:e,offset:t}),jl=(e,t,o)=>e.property().isText(t)&&0===e.property().getText(t).trim().length||e.property().isComment(t)?o(t).bind((t=>jl(e,t,o).orThunk((()=>C.some(t))))):C.none(),Pl=(e,t)=>e.property().isText(t)?e.property().getText(t).length:e.property().children(t).length,Il=(e,t)=>{const o=jl(e,t,e.query().prevSibling).getOr(t);if(e.property().isText(o))return Wl(o,Pl(e,o));const n=e.property().children(o);return n.length>0?Il(e,n[n.length-1]):Wl(o,Pl(e,o))},Fl=Il,Hl=El(),$l=e=>t=>0===e.property().children(t).length,Vl=(e,t,o,n)=>Ml(e,t,o,_l,{sibling:(e,t)=>e.query().prevSibling(t),first:e=>e.length>0?C.some(e[e.length-1]):C.none()},n),ql=(e,t,o,n)=>Ml(e,t,o,_l,{sibling:(e,t)=>e.query().nextSibling(t),first:e=>e.length>0?C.some(e[0]):C.none()},n),Ul=El(),Gl=(e,t)=>((e,t,o)=>Vl(e,t,$l(e),o))(Ul,e,t),Kl=(e,t)=>((e,t,o)=>ql(e,t,$l(e),o))(Ul,e,t),Yl=["body","p","div","article","aside","figcaption","figure","footer","header","nav","section","ol","ul","table","thead","tfoot","tbody","caption","tr","td","th","h1","h2","h3","h4","h5","h6","blockquote","pre","address"],Jl=(e,t,o,n)=>{const r=t(e,o);return z(n,((o,n)=>{const r=t(e,n);return Ql(e,o,r)}),r)},Ql=(e,t,o)=>t.bind((t=>o.filter(b(e.eq,t)))),Xl=El(),Zl=(e,t)=>((e,t,o)=>o.length>0?((e,t,o,n)=>n(e,t,o[0],o.slice(1)))(e,t,o,Jl):C.none())(Xl,((t,o)=>e(o)),t),ea=El(),ta=e=>((e,t)=>{const o=e.property().name(t);return D(Yl,o)})(ea,e),oa=e=>((e,t)=>{const o=e.property().name(t);return D(["ol","ul"],o)})(ea,e),na=e=>{const t=It("br"),o=e=>Tn(e).bind((o=>{const n=Gt(o).map((e=>!!ta(e)||!!((e,t)=>D(["br","img","hr","input"],e.property().name(t)))(ea,e)&&"img"!==Bt(e))).getOr(!1);return $t(o).map((r=>{return!0===n||("li"===Bt(s=r)||on(s,oa).isSome())||t(o)||ta(r)&&!Je(e,r)?[]:[Me.fromTag("br")];var s}))})).getOr([]),n=(()=>{const n=j(e,(e=>{const n=Kt(e);return(e=>P(e,(e=>t(e)||Wt(e)&&0===Jo(e).trim().length)))(n)?[]:n.concat(o(e))}));return 0===n.length?[Me.fromTag("br")]:n})();vo(e[0]),mo(e[0],n)},ra=e=>{bo(e,"width"),bo(e,"height")},sa=e=>{const t=xs(e);Tl(e,C.some(t),C.none()),ra(e)},la=e=>{const t=(e=>Fo(e)+"px")(e);Tl(e,C.some(t),C.none()),ra(e)},aa=e=>{Ao(e,"width");const t=cr(e),o=t.length>0?t:ar(e);N(o,(e=>{Ao(e,"width"),ra(e)})),ra(e)},ca={scope:["row","col"]},ia=e=>()=>{const t=Me.fromTag("td",e.dom);return ao(t,Me.fromTag("br",e.dom)),t},ma=e=>()=>Me.fromTag("col",e.dom),da=e=>()=>Me.fromTag("colgroup",e.dom),ua=e=>()=>Me.fromTag("tr",e.dom),fa=(e,t,o)=>{const n=((e,t)=>{const o=Ro(e,t),n=Kt(To(e));return mo(o,n),o})(e,t);return G(o,((e,t)=>{null===e?bo(n,t):fo(n,t,e)})),n},ga=e=>e,ha=(e,t,o)=>{const n=(e,t)=>{((e,t)=>{const o=e.dom,n=t.dom;Do(o)&&Do(n)&&(n.style.cssText=o.style.cssText)})(e.element,t),Ao(t,"height"),1!==e.colspan&&Ao(t,"width")};return{col:o=>{const r=Me.fromTag(Bt(o.element),t.dom);return n(o,r),e(o.element,r),r},colgroup:da(t),row:ua(t),cell:r=>{const s=Me.fromTag(Bt(r.element),t.dom),l=o.getOr(["strong","em","b","i","span","font","h1","h2","h3","h4","h5","h6","p","div"]),a=l.length>0?((e,t,o)=>Sn(e).map((n=>{const r=o.join(","),s=bn(n,r,(t=>Je(t,e)));return z(s,((e,t)=>{const o=So(t);return ao(e,o),o}),t)})).getOr(t))(r.element,s,l):s;return ao(a,Me.fromTag("br")),n(r,s),((e,t)=>{G(ca,((o,n)=>po(e,n).filter((e=>D(o,e))).each((e=>fo(t,n,e)))))})(r.element,s),e(r.element,s),s},replace:fa,colGap:ma(t),gap:ia(t)}},pa=e=>({col:ma(e),colgroup:da(e),row:ua(e),cell:ia(e),replace:ga,colGap:ma(e),gap:ia(e)}),ba=e=>Dr(e).grid,wa=(e,t,o,n)=>{const r=ze(e).rows;let s=!0;for(let e=0;e({rowDelta:0,colDelta:_e(e[0])-_e(t[0])}),ya=(e,t)=>({rowDelta:e.length-t.length,colDelta:0}),xa=(e,t,o,n)=>{const r="colgroup"===t.section?o.col:o.cell;return k(e,(e=>Te(r(),!0,n(e))))},Ca=(e,t,o,n)=>{const r=e[e.length-1];return e.concat(k(t,(()=>{const e="colgroup"===r.section?o.colgroup:o.row,t=Ae(r,e,h),s=xa(t.cells.length,t,o,(e=>X(n,e.toString())));return Ee(t,s)})))},Sa=(e,t,o,n)=>E(e,(e=>{const r=xa(t,e,o,y);return De(e,n,r)})),Ta=(e,t,o)=>{const n=t.colDelta<0?Sa:h,r=t.rowDelta<0?Ca:h,s=Cr(e),l=_e(e[0]),a=O(s,(e=>e===l-1)),c=n(e,Math.abs(t.colDelta),o,a?l-1:l),i=Cr(c);return r(c,Math.abs(t.rowDelta),o,I(i,x))},Ra=(e,t,o,n)=>{const r=b(n,Ne(e[t],o).element),s=e[t];return e.length>1&&_e(s)>1&&(o>0&&r(Be(s,o-1))||o0&&r(Be(e[t-1],o))||t_(o,(o=>o>=e.column&&o<=_e(t[0])+e.column)),Oa=(e,t,o,n,r)=>{((e,t,o,n)=>{t>0&&t{const r=e.cells[t-1];let s=0;const l=n();for(;e.cells.length>t+s&&o(r.element,e.cells[t+s].element);)ke(e,t+s,Te(l,!0,e.cells[t+s].isLocked)),s++}))})(t,e,r,n.cell);const s=ya(o,t),l=Ta(o,s,n),a=ya(t,l),c=Ta(t,a,n);return E(c,((t,o)=>De(t,e,l[o].cells)))},ka=(e,t,o,n,r)=>{((e,t,o,n)=>{const r=ze(e).rows;if(t>0&&tA(e,((e,o)=>O(e,(e=>t(e.element,o.element)))?e:e.concat([o])),[]))(r[t-1].cells,o);N(e,(e=>{let s=C.none();for(let l=t;l{ke(a,t,Te(e,!0,c.isLocked))})))}}))}})(t,e,r,n.cell);const s=Cr(t),l=va(t,o),a={...l,colDelta:l.colDelta-s.length},c=Ta(t,a,n),{cols:i,rows:m}=ze(c),d=Cr(c),u=va(o,t),f={...u,colDelta:u.colDelta+d.length},g=(p=n,b=d,E(o,(e=>A(b,((t,o)=>{const n=xa(1,e,p,x)[0];return Oe(t,o,n)}),e)))),h=Ta(g,f,n);var p,b;return[...i,...m.slice(0,e),...h,...m.slice(e,m.length)]},Ea=(e,t,o,n,r)=>{const{rows:s,cols:l}=ze(e),a=s.slice(0,t),c=s.slice(t);return[...l,...a,((e,t,o,n)=>Ae(e,(e=>n(e,o)),t))(s[o],((e,o)=>t>0&&tE(e,(e=>{const s=t>0&&t<_e(e)&&n(Be(e,t-1),Be(e,t)),l=((e,t,o,n,r,s,l)=>{if("colgroup"!==o&&n)return Ne(e,t);{const t=Ne(e,r);return Te(l(t.element,s),!0,!1)}})(e,t,e.section,s,o,n,r);return Oe(e,t,l)})),Ba=(e,t,o,n)=>((e,t,o,n)=>void 0!==Be(e[t],o)&&t>0&&n(Be(e[t-1],o),Be(e[t],o)))(e,t,o,n)||((e,t,o)=>t>0&&o(Be(e,t-1),Be(e,t)))(e[t],o,n),_a=(e,t,o,n)=>{const r=e=>(e=>"row"===e?(e=>Zn(e,"rowspan")>1)(t):er(t))(e)?`${e}group`:e;return e?ur(t)?r(o):null:n&&ur(t)?r("row"===o?"col":"row"):null},za=(e,t,o)=>Te(o(e.element,t),!0,e.isLocked),Aa=(e,t,o,n,r,s,l)=>E(e,((e,a)=>(e=>{const c=e.cells,i=E(c,((e,c)=>{if((e=>O(t,(t=>o(e.element,t.element))))(e)){const t=l(e,a,c)?r(e,o,n):e;return s(t,a,c).each((e=>{var o,n;o=t.element,n={scope:C.from(e)},G(n,((e,t)=>{e.fold((()=>{bo(o,t)}),(e=>{uo(o.dom,t,e)}))}))})),t}return e}));return Re(e.element,i,e.section,e.isNew)})(e))),La=(e,t,o)=>j(e,((n,r)=>Ba(e,r,t,o)?[]:[Ne(n,t)])),Ma=(e,t,o,n,r)=>{const s=ze(e).rows,l=j(t,(e=>La(s,e,n))),a=E(s,(e=>fr(e.cells))),c=((e,t)=>P(t,h)&&fr(e)?x:(e,o,n)=>!("th"===Bt(e.element)&&t[o]))(l,a),i=((e,t)=>(o,n)=>C.some(_a(e,o.element,"row",t[n])))(o,a);return Aa(e,l,n,r,za,i,c)},Wa=(e,t,o,n)=>{const r=ze(e).rows,s=E(t,(e=>Ne(r[e.row],e.column)));return Aa(e,s,o,n,za,C.none,x)},ja=e=>A(e,((e,t)=>O(e,(e=>e.column===t.column))?e:e.concat([t])),[]).sort(((e,t)=>e.column-t.column)),Pa=e=>gn(e,!0),Ia=e=>{0===ar(e).length&&yo(e)},Fa=(e,t)=>({grid:e,cursor:t}),Ha=(e,t,o)=>{const n=((e,t,o)=>{var n,r;const s=ze(e).rows;return C.from(null===(r=null===(n=s[t])||void 0===n?void 0:n.cells[o])||void 0===r?void 0:r.element).filter(Pa).orThunk((()=>(e=>V(e,(e=>V(e.cells,(e=>{const t=e.element;return de(Pa(t),t)})))))(s)))})(e,t,o);return Fa(e,n)},$a=e=>A(e,((e,t)=>O(e,(e=>e.row===t.row))?e:e.concat([t])),[]).sort(((e,t)=>e.row-t.row)),Va=(e,t,o,n)=>{const r=t[0].row,s=$a(t),l=z(s,((e,t)=>({grid:Ea(e.grid,r,t.row+e.delta,o,n.getOrInit),delta:e.delta+1})),{grid:e,delta:0}).grid;return Ha(l,r,t[0].column)},qa=(e,t,o,n)=>{const r=$a(t),s=r[r.length-1],l=s.row+s.rowspan,a=z(r,((e,t)=>Ea(e,l,t.row,o,n.getOrInit)),e);return Ha(a,l,t[0].column)},Ua=(e,t,o,n)=>{const r=t.details,s=ja(r),l=s[0].column,a=z(s,((e,t)=>({grid:Na(e.grid,l,t.column+e.delta,o,n.getOrInit),delta:e.delta+1})),{grid:e,delta:0}).grid;return Ha(a,r[0].row,l)},Ga=(e,t,o,n)=>{const r=t.details,s=r[r.length-1],l=s.column+s.colspan,a=ja(r),c=z(a,((e,t)=>Na(e,l,t.column,o,n.getOrInit)),e);return Ha(c,r[0].row,l)},Ka=(e,t,o,n)=>{const r=ja(t),s=E(r,(e=>e.column)),l=Ma(e,s,!0,o,n.replaceOrInit);return Ha(l,t[0].row,t[0].column)},Ya=(e,t,o,n)=>{const r=Wa(e,t,o,n.replaceOrInit);return Ha(r,t[0].row,t[0].column)},Ja=(e,t,o,n)=>{const r=ja(t),s=E(r,(e=>e.column)),l=Ma(e,s,!1,o,n.replaceOrInit);return Ha(l,t[0].row,t[0].column)},Qa=(e,t,o,n)=>{const r=Wa(e,t,o,n.replaceOrInit);return Ha(r,t[0].row,t[0].column)},Xa=(e,t)=>(o,n,r,s,l)=>{const a=$a(n),c=E(a,(e=>e.row)),i=((e,t,o,n,r,s,l)=>{const{cols:a,rows:c}=ze(e),i=c[t[0]],m=j(t,(e=>((e,t,o)=>{const n=e[t];return j(n.cells,((n,r)=>Ba(e,t,r,o)?[]:[n]))})(c,e,r))),d=E(i.cells,((e,t)=>fr(La(c,t,r)))),u=[...c];N(t,(e=>{u[e]=l.transformRow(c[e],o)}));const f=[...a,...u],g=((e,t)=>P(t,h)&&fr(e.cells)?x:(e,o,n)=>!("th"===Bt(e.element)&&t[n]))(i,d),p=((e,t)=>(o,n,r)=>C.some(_a(e,o.element,"col",t[r])))(n,d);return Aa(f,m,r,s,l.transformCell,p,g)})(o,c,e,t,r,s.replaceOrInit,l);return Ha(i,n[0].row,n[0].column)},Za=Xa("thead",!0),ec=Xa("tbody",!1),tc=Xa("tfoot",!1),oc=(e,t,o,n)=>{const r=ja(t.details),s=((e,t)=>j(e,(e=>{const o=e.cells,n=z(t,((e,t)=>t>=0&&t0?[Re(e.element,n,e.section,e.isNew)]:[]})))(e,E(r,(e=>e.column))),l=s.length>0?s[0].cells.length-1:0;return Ha(s,r[0].row,Math.min(r[0].column,l))},nc=(e,t,o,n)=>{const r=$a(t),s=((e,t,o)=>{const{rows:n,cols:r}=ze(e);return[...r,...n.slice(0,t),...n.slice(o+1)]})(e,r[0].row,r[r.length-1].row),l=Math.max(ze(s).rows.length-1,0);return Ha(s,Math.min(t[0].row,l),t[0].column)},rc=(e,t,o,n)=>{const r=t.cells;na(r);const s=((e,t,o,n)=>{const r=ze(e).rows;if(0===r.length)return e;for(let e=t.startRow;e<=t.finishRow;e++)for(let o=t.startCol;o<=t.finishCol;o++){const t=r[e],s=Ne(t,o).isLocked;ke(t,o,Te(n(),!1,s))}return e})(e,t.bounds,0,n.merge(r));return Fa(s,C.from(r[0]))},sc=(e,t,o,n)=>{const r=z(t,((e,t)=>wa(e,t,o,n.unmerge(t))),e);return Fa(r,C.from(t[0]))},lc=(e,t,o,n)=>{const r=((e,t)=>{const o=Dr(e);return Hs(o,t,!0)})(t.clipboard,t.generators);var s,l;return((e,t,o,n,r)=>{const s=Cr(t),l=((e,t,o)=>{const n=_e(t[0]),r=ze(t).cols.length+e.row,s=k(n-e.column,(t=>t+e.column));return{row:r,column:L(s,(e=>P(o,(t=>t!==e)))).getOr(n-1)}})(e,t,s),a=ze(o).rows,c=Da(l,a,s),i=((e,t,o)=>{if(e.row>=t.length||e.column>_e(t[0]))return le.error("invalid start address out of table bounds, row: "+e.row+", column: "+e.column);const n=t.slice(e.row),r=n[0].cells.slice(e.column),s=_e(o[0]),l=o.length;return le.value({rowDelta:n.length-l,colDelta:r.length-s})})(l,t,a);return i.map((e=>{const o={...e,colDelta:e.colDelta-c.length},s=Ta(t,o,n),i=Cr(s),m=Da(l,a,i);return((e,t,o,n,r,s)=>{const l=e.row,a=e.column,c=l+o.length,i=a+_e(o[0])+s.length,m=I(s,x);for(let e=l;eFa(e,C.some(t.element))),(e=>Ha(e,t.row,t.column)))},ac=(e,t,o)=>{const n=((e,t)=>br(e,(()=>t)))(e,o.section),r=Or(n);return Hs(r,t,!0)},cc=(e,t,o,n)=>{const r=ze(e).rows,s=t.cells[0].column,l=r[t.cells[0].row],a=ac(t.clipboard,t.generators,l),c=Oa(s,e,a,t.generators,o);return Ha(c,t.cells[0].row,t.cells[0].column)},ic=(e,t,o,n)=>{const r=ze(e).rows,s=t.cells[t.cells.length-1].column+t.cells[t.cells.length-1].colspan,l=r[t.cells[0].row],a=ac(t.clipboard,t.generators,l),c=Oa(s,e,a,t.generators,o);return Ha(c,t.cells[0].row,s)},mc=(e,t,o,n)=>{const r=ze(e).rows,s=t.cells[0].row,l=r[s],a=ac(t.clipboard,t.generators,l),c=ka(s,e,a,t.generators,o);return Ha(c,t.cells[0].row,t.cells[0].column)},dc=(e,t,o,n)=>{const r=ze(e).rows,s=t.cells[t.cells.length-1].row+t.cells[t.cells.length-1].rowspan,l=r[t.cells[0].row],a=ac(t.clipboard,t.generators,l),c=ka(s,e,a,t.generators,o);return Ha(c,s,t.cells[0].column)},uc=(e,t,o,n)=>((e,t,o,n)=>{const r=Or(t),s=n.getWidths(r,n);tl(r,s,n)})(0,t,0,n.sizing),fc=(e,t,o,n)=>((e,t,o,n,r)=>{const s=Or(t),l=n.getWidths(s,n),a=n.pixelWidth(),{newSizes:c,delta:i}=r.calcRedestributedWidths(l,a,o.pixelDelta,n.isRelative);tl(s,c,n),n.adjustTableWidth(i)})(0,t,o,n.sizing,n.resize),gc=(e,t)=>O(t,(e=>0===e.column&&e.isLocked)),hc=(e,t)=>O(t,(t=>t.column+t.colspan>=e.grid.columns&&t.isLocked)),pc=(e,t)=>{const o=Vr(e),n=ja(t);return A(n,((e,t)=>e+o[t.column].map(Ho).getOr(0)),0)},bc=e=>(t,o)=>Ys(t,o).filter((o=>!(e?gc:hc)(t,o))).map((e=>({details:e,pixelDelta:pc(t,e)}))),wc=(e,t)=>Js(e,t).map((t=>({details:t,pixelDelta:-pc(e,t)}))),vc=e=>(t,o)=>Ks(t,o).filter((o=>!(e?gc:hc)(t,o.cells))),yc=gl("th"),xc=gl("td"),Cc=(e,t,o,n)=>Us(Va,Ys,f,f,fl,e,t,o,n),Sc=(e,t,o,n)=>Us(qa,Ys,f,f,fl,e,t,o,n),Tc=(e,t,o,n)=>Us(Ua,bc(!0),fc,f,fl,e,t,o,n),Rc=(e,t,o,n)=>Us(Ga,bc(!1),fc,f,fl,e,t,o,n),Dc=(e,t,o,n)=>Us(oc,wc,fc,Ia,fl,e,t,o,n),Oc=(e,t,o,n)=>Us(nc,Ys,f,Ia,fl,e,t,o,n),kc=(e,t,o,n)=>Us(Ka,Js,f,f,yc,e,t,o,n),Ec=(e,t,o,n)=>Us(Ja,Js,f,f,xc,e,t,o,n),Nc=(e,t,o,n)=>Us(Za,Ys,f,f,yc,e,t,o,n),Bc=(e,t,o,n)=>Us(ec,Ys,f,f,xc,e,t,o,n),_c=(e,t,o,n)=>Us(tc,Ys,f,f,xc,e,t,o,n),zc=(e,t,o,n)=>Us(Ya,Js,f,f,yc,e,t,o,n),Ac=(e,t,o,n)=>Us(Qa,Js,f,f,xc,e,t,o,n),Lc=(e,t,o,n)=>Us(rc,Xs,uc,f,hl,e,t,o,n),Mc=(e,t,o,n)=>Us(sc,Zs,uc,f,hl,e,t,o,n),Wc=(e,t,o,n)=>Us(lc,Gs,uc,f,fl,e,t,o,n),jc=(e,t,o,n)=>Us(cc,vc(!0),f,f,fl,e,t,o,n),Pc=(e,t,o,n)=>Us(ic,vc(!1),f,f,fl,e,t,o,n),Ic=(e,t,o,n)=>Us(mc,Ks,f,f,fl,e,t,o,n),Fc=(e,t,o,n)=>Us(dc,Ks,f,f,fl,e,t,o,n),Hc=(e,t)=>{const o=Dr(e);return Ys(o,t).bind((e=>{const t=e[e.length-1],n=e[0].column,r=t.column+t.colspan,s=W(E(o.all,(e=>_(e.cells,(e=>e.column>=n&&e.column{const o=Dr(e);return Ys(o,t).bind(pr).getOr("")},Vc=(e,t)=>{const o=Dr(e);return Ys(o,t).bind((e=>{const t=e[e.length-1],n=e[0].row,r=t.row+t.rowspan;return(e=>{const t=E(e,(e=>hr(e).type)),o=D(t,"header"),n=D(t,"footer");if(o||n){const e=D(t,"body");return!o||e||n?o||e||!n?C.none():C.some("footer"):C.some("header")}return C.some("body")})(o.all.slice(n,r))})).getOr("")},qc=(e,t)=>{const o=t.column,n=t.column+t.colspan-1,r=t.row,s=t.row+t.rowspan-1;return o<=e.finishCol&&n>=e.startCol&&r<=e.finishRow&&s>=e.startRow},Uc=(e,t)=>t.column>=e.startCol&&t.column+t.colspan-1<=e.finishCol&&t.row>=e.startRow&&t.row+t.rowspan-1<=e.finishRow,Gc=(e,t,o)=>{const n=Er(e,t,Je),r=Er(e,o,Je);return n.bind((e=>r.map((t=>{return o=e,n=t,{startRow:Math.min(o.row,n.row),startCol:Math.min(o.column,n.column),finishRow:Math.max(o.row+o.rowspan-1,n.row+n.rowspan-1),finishCol:Math.max(o.column+o.colspan-1,n.column+n.colspan-1)};var o,n}))))},Kc=(e,t,o)=>Gc(e,t,o).map((t=>{const o=Nr(e,b(qc,t));return E(o,(e=>e.element))})),Yc=(e,t)=>Er(e,t,((e,t)=>Qe(t,e))).map((e=>e.element)),Jc=(e,t,o)=>{const n=Xc(e);return Kc(n,t,o)},Qc=(e,t,o,n,r)=>{const s=Xc(e),l=Je(e,o)?C.some(t):Yc(s,t),a=Je(e,r)?C.some(n):Yc(s,n);return l.bind((e=>a.bind((t=>Kc(s,e,t)))))},Xc=Dr,Zc={styles:{"border-collapse":"collapse",width:"100%"},attributes:{border:"1"},colGroups:!1},ei=(e,t,o,n)=>k(e,(e=>((e,t,o,n)=>{const r=Me.fromTag("tr");for(let s=0;s{let t=[];return{bind:e=>{if(void 0===e)throw new Error("Event bind error: undefined handler");t.push(e)},unbind:e=>{t=_(t,(t=>t!==e))},trigger:(...o)=>{const n={};N(e,((e,t)=>{n[e]=o[t]})),N(t,(e=>{e(n)}))}}},oi=e=>({registry:K(e,(e=>({bind:e.bind,unbind:e.unbind}))),trigger:K(e,(e=>e.trigger))}),ni=ne(["compare","extract","mutate","sink"]),ri=ne(["element","start","stop","destroy"]),si=ne(["forceDrop","drop","move","delayDrop"]),li=()=>{const e=(()=>{const e=oi({move:ti(["info"])});return{onEvent:f,reset:f,events:e.registry}})(),t=(()=>{let e=C.none();const t=oi({move:ti(["info"])});return{onEvent:(o,n)=>{n.extract(o).each((o=>{const r=((t,o)=>{const n=e.map((e=>t.compare(e,o)));return e=C.some(o),n})(n,o);r.each((e=>{t.trigger.move(e)}))}))},reset:()=>{e=C.none()},events:t.registry}})();let o=e;return{on:()=>{o.reset(),o=t},off:()=>{o.reset(),o=e},isOn:()=>o===t,onEvent:(e,t)=>{o.onEvent(e,t)},events:t.events}},ai=ce("ephox-dragster").resolve;var ci=ni({compare:(e,t)=>qo(t.left-e.left,t.top-e.top),extract:e=>C.some(qo(e.x,e.y)),sink:(e,t)=>{const o=(e=>{const t={layerClass:ai("blocker"),...e},o=Me.fromTag("div");return fo(o,"role","presentation"),No(o,{position:"fixed",left:"0px",top:"0px",width:"100%",height:"100%"}),dn(o,ai("blocker")),dn(o,t.layerClass),{element:g(o),destroy:()=>{yo(o)}}})(t),n=oo(o.element(),"mousedown",e.forceDrop),r=oo(o.element(),"mouseup",e.drop),s=oo(o.element(),"mousemove",e.move),l=oo(o.element(),"mouseout",e.delayDrop);return ri({element:o.element,start:e=>{ao(e,o.element())},stop:()=>{yo(o.element())},destroy:()=>{o.destroy(),r.unbind(),s.unbind(),l.unbind(),n.unbind()}})},mutate:(e,t)=>{e.mutate(t.left,t.top)}});const ii=ce("ephox-snooker").resolve,mi=ii("resizer-bar"),di=ii("resizer-rows"),ui=ii("resizer-cols"),fi=e=>{const t=vn(e.parent(),"."+mi);N(t,yo)},gi=(e,t,o)=>{const n=e.origin();N(t,(t=>{t.each((t=>{const r=o(n,t);dn(r,mi),ao(e.parent(),r)}))}))},hi=(e,t,o,n,r)=>{const s=Go(o),l=t.isResizable,a=n.length>0?ns.positions(n,o):[],c=a.length>0?((e,t)=>j(e.all,((e,o)=>t(e.element)?[o]:[])))(e,l):[];((e,t,o,n)=>{gi(e,t,((e,t)=>{const r=((e,t,o,n)=>{const r=Me.fromTag("div");return No(r,{position:"absolute",left:t+"px",top:o-3.5+"px",height:"7px",width:n+"px"}),go(r,{"data-mce-bogus":"all","data-row":e,role:"presentation"}),r})(t.row,o.left-e.left,t.y-e.top,n);return dn(r,di),r}))})(t,_(a,((e,t)=>O(c,(e=>t===e)))),s,Ho(o));const i=r.length>0?ss.positions(r,o):[],m=i.length>0?((e,t)=>{const o=[];return k(e.grid.columns,(n=>{Ar(e,n).map((e=>e.element)).forall(t)&&o.push(n)})),_(o,(o=>{const n=Nr(e,(e=>e.column===o));return P(n,(e=>t(e.element)))}))})(e,l):[];((e,t,o,n)=>{gi(e,t,((e,t)=>{const r=((e,t,o,n,r)=>{const s=Me.fromTag("div");return No(s,{position:"absolute",left:t-3.5+"px",top:o+"px",height:r+"px",width:"7px"}),go(s,{"data-mce-bogus":"all","data-column":e,role:"presentation"}),s})(t.col,t.x-e.left,o.top-e.top,0,n);return dn(r,ui),r}))})(t,_(i,((e,t)=>O(m,(e=>t===e)))),s,Po(o))},pi=(e,t)=>{if(fi(e),e.isResizable(t)){const o=Dr(t),n=Ur(o),r=Vr(o);hi(o,e,t,n,r)}},bi=(e,t)=>{const o=vn(e.parent(),"."+mi);N(o,t)},wi=e=>{bi(e,(e=>{Eo(e,"display","none")}))},vi=e=>{bi(e,(e=>{Eo(e,"display","block")}))},yi=ii("resizer-bar-dragging"),xi=e=>{const t=(()=>{const e=oi({drag:ti(["xDelta","yDelta","target"])});let t=C.none();const o=(()=>{const e=oi({drag:ti(["xDelta","yDelta"])});return{mutate:(t,o)=>{e.trigger.drag(t,o)},events:e.registry}})();return o.events.drag.bind((o=>{t.each((t=>{e.trigger.drag(o.xDelta,o.yDelta,t)}))})),{assign:e=>{t=C.some(e)},get:()=>t,mutate:o.mutate,events:e.registry}})(),o=((e,t={})=>{var o;return((e,t,o)=>{let n=!1;const r=oi({start:ti([]),stop:ti([])}),s=li(),l=()=>{m.stop(),s.isOn()&&(s.off(),r.trigger.stop())},c=(e=>{let t=null;const o=()=>{a(t)||(clearTimeout(t),t=null)};return{cancel:o,throttle:(...n)=>{o(),t=setTimeout((()=>{t=null,e.apply(null,n)}),200)}}})(l);s.events.move.bind((o=>{t.mutate(e,o.info)}));const i=e=>(...t)=>{n&&e.apply(null,t)},m=t.sink(si({forceDrop:l,drop:i(l),move:i((e=>{c.cancel(),s.onEvent(e,t)})),delayDrop:i(c.throttle)}),o);return{element:m.element,go:e=>{m.start(e),s.on(),r.trigger.start()},on:()=>{n=!0},off:()=>{n=!1},isActive:()=>n,destroy:()=>{m.destroy()},events:r.registry}})(e,null!==(o=t.mode)&&void 0!==o?o:ci,t)})(t,{});let n=C.none();const r=(e,t)=>C.from(ho(e,t));t.events.drag.bind((e=>{r(e.target,"data-row").each((t=>{const o=tr(e.target,"top");Eo(e.target,"top",o+e.yDelta+"px")})),r(e.target,"data-column").each((t=>{const o=tr(e.target,"left");Eo(e.target,"left",o+e.xDelta+"px")}))}));const s=(e,t)=>tr(e,t)-Xn(e,"data-initial-"+t,0);o.events.stop.bind((()=>{t.get().each((t=>{n.each((o=>{r(t,"data-row").each((e=>{const n=s(t,"top");bo(t,"data-initial-top"),d.trigger.adjustHeight(o,n,parseInt(e,10))})),r(t,"data-column").each((e=>{const n=s(t,"left");bo(t,"data-initial-left"),d.trigger.adjustWidth(o,n,parseInt(e,10))})),pi(e,o)}))}))}));const l=(n,r)=>{d.trigger.startAdjust(),t.assign(n),fo(n,"data-initial-"+r,tr(n,r)),dn(n,yi),Eo(n,"opacity","0.2"),o.go(e.dragContainer())},c=oo(e.parent(),"mousedown",(e=>{var t;t=e.target,un(t,di)&&l(e.target,"top"),(e=>un(e,ui))(e.target)&&l(e.target,"left")})),i=t=>Je(t,e.view()),m=oo(e.view(),"mouseover",(t=>{var r;(r=t.target,an(r,"table",i).filter(gn)).fold((()=>{Oo(t.target)&&!(e=>un(e,"ephox-snooker-resizer-bar")||un(e,"ephox-dragster-blocker"))(t.target)&&fi(e)}),(t=>{o.isActive()&&(n=C.some(t),pi(e,t))}))})),d=oi({adjustHeight:ti(["table","delta","row"]),adjustWidth:ti(["table","delta","column"]),startAdjust:ti([])});return{destroy:()=>{c.unbind(),m.unbind(),o.destroy(),fi(e)},refresh:t=>{pi(e,t)},on:o.on,off:o.off,hideBars:b(wi,e),showBars:b(vi,e),events:d.registry}},Ci=e=>t=>t.options.get(e),Si="100%",Ti=e=>{var t;const o=e.dom,n=null!==(t=o.getParent(e.selection.getStart(),o.isBlock))&&void 0!==t?t:e.getBody();return $o(Me.fromDom(n))+"px"},Ri=e=>C.from(e.options.get("table_clone_elements")),Di=Ci("table_header_type"),Oi=Ci("table_column_resizing"),ki=e=>"preservetable"===Oi(e),Ei=e=>"resizetable"===Oi(e),Ni=Ci("table_sizing_mode"),Bi=e=>"relative"===Ni(e),_i=e=>"fixed"===Ni(e),zi=e=>"responsive"===Ni(e),Ai=Ci("table_resize_bars"),Li=Ci("table_style_by_css"),Mi=Ci("table_merge_content_on_paste"),Wi=e=>{const t=e.options,o=t.get("table_default_attributes");return t.isSet("table_default_attributes")?o:((e,t)=>zi(e)||Li(e)?t:_i(e)?{...t,width:Ti(e)}:{...t,width:Si})(e,o)},ji=Ci("table_use_colgroups"),Pi=e=>Me.fromDom(e.getBody()),Ii=e=>t=>Je(t,Pi(e)),Fi=e=>{bo(e,"data-mce-style");const t=e=>bo(e,"data-mce-style");N(ar(e),t),N(cr(e),t),N(mr(e),t)},Hi=e=>Me.fromDom(e.selection.getStart()),$i=e=>e.getBoundingClientRect().width,Vi=e=>e.getBoundingClientRect().height,qi=e=>(t,o)=>{const n=t.dom.getStyle(o,e)||t.dom.getAttrib(o,e);return C.from(n).filter(ve)},Ui=qi("width"),Gi=qi("height"),Ki=e=>nn(e,It("table")).exists(gn),Yi=e=>rn(e,"table"),Ji=(e,t,o)=>{const n=e=>t=>void 0!==o&&o(t)||Je(t,e);return Je(e,t)?C.some({boxes:C.some([e]),start:e,finish:t}):Yi(e).bind((r=>Yi(t).bind((s=>{if(Je(r,s))return C.some({boxes:Jc(r,e,t),start:e,finish:t});if(Qe(r,s)){const o=bn(t,"td,th",n(r)),l=o.length>0?o[o.length-1]:t;return C.some({boxes:Qc(r,e,r,t,s),start:e,finish:l})}if(Qe(s,r)){const o=bn(e,"td,th",n(s)),l=o.length>0?o[o.length-1]:e;return C.some({boxes:Qc(s,e,r,t,s),start:e,finish:l})}return((e,t)=>((e,t,o,n=y)=>{const r=[t].concat(e.up().all(t)),s=[o].concat(e.up().all(o)),l=e=>M(e,n).fold((()=>e),(t=>e.slice(0,t+1))),a=l(r),c=l(s),i=L(a,(t=>O(c,((e,t)=>b(e.eq,t))(e,t))));return{firstpath:a,secondpath:c,shared:i}})(Xl,e,t,void 0))(e,t).shared.bind((l=>an(l,"table",o).bind((o=>{const l=bn(t,"td,th",n(o)),a=l.length>0?l[l.length-1]:t,c=bn(e,"td,th",n(o)),i=c.length>0?c[c.length-1]:e;return C.some({boxes:Qc(o,e,r,t,s),start:i,finish:a})}))))}))))},Qi=(e,t)=>{const o=vn(e,t);return o.length>0?C.some(o):C.none()},Xi=(e,t,o)=>ln(e,t).bind((t=>ln(e,o).bind((e=>Zl(Yi,[t,e]).map((o=>({first:t,last:e,table:o}))))))),Zi=(e,t,o,n,r)=>((e,t)=>L(e,(e=>Ge(e,t))))(e,r).bind((e=>((e,t,o)=>ir(e).bind((n=>((e,t,o,n)=>Er(e,t,Je).bind((t=>{const r=o>0?t.row+t.rowspan-1:t.row,s=n>0?t.column+t.colspan-1:t.column;return kr(e,r+o,s+n).map((e=>e.element))})))(Xc(n),e,t,o))))(e,t,o).bind((e=>((e,t)=>rn(e,"table").bind((o=>ln(o,t).bind((t=>Ji(t,e).bind((e=>e.boxes.map((t=>({boxes:t,start:e.start,finish:e.finish}))))))))))(e,n))))),em=(e,t)=>Qi(e,t),tm=(e,t,o)=>Xi(e,t,o).bind((t=>{const o=t=>Je(e,t),n="thead,tfoot,tbody,table",r=rn(t.first,n,o),s=rn(t.last,n,o);return r.bind((e=>s.bind((o=>Je(e,o)?((e,t,o)=>((e,t,o)=>Gc(e,t,o).bind((t=>((e,t)=>{let o=!0;const n=b(Uc,t);for(let r=t.startRow;r<=t.finishRow;r++)for(let s=t.startCol;s<=t.finishCol;s++)o=o&&kr(e,r,s).exists(n);return o?C.some(t):C.none()})(e,t))))(Xc(e),t,o))(t.table,t.first,t.last):C.none()))))})),om=h,nm=e=>{const t=(e,t)=>po(e,t).exists((e=>parseInt(e,10)>1));return e.length>0&&P(e,(e=>t(e,"rowspan")||t(e,"colspan")))?C.some(e):C.none()},rm=(e,t,o)=>t.length<=1?C.none():tm(e,o.firstSelectedSelector,o.lastSelectedSelector).map((e=>({bounds:e,cells:t}))),sm=(e,t)=>({selection:e,kill:t}),lm=()=>({tag:"none"}),am=e=>({tag:"multiple",elements:e}),cm=e=>({tag:"single",element:e}),im=(e,t,o,n)=>({start:kn.on(e,t),finish:kn.on(o,n)}),mm=(e,t)=>{const o=Ue(e,t);return Dn(Me.fromDom(o.startContainer),o.startOffset,Me.fromDom(o.endContainer),o.endOffset)},dm=im,um=(e,t,o,n,r)=>Je(o,n)?C.none():Ji(o,n,t).bind((t=>{const n=t.boxes.getOr([]);return n.length>1?(r(e,n,t.start,t.finish),C.some(sm(C.some(dm(o,0,o,yn(o))),!0))):C.none()})),fm=Z([{none:["message"]},{success:[]},{failedUp:["cell"]},{failedDown:["cell"]}]),gm=e=>an(e,"tr"),hm={...fm,verify:(e,t,o,n,r,s,l)=>an(n,"td,th",l).bind((o=>an(t,"td,th",l).map((t=>Je(o,t)?Je(n,o)&&yn(o)===r?s(t):fm.none("in same cell"):Zl(gm,[o,t]).fold((()=>((e,t,o)=>{const n=e.getRect(t),r=e.getRect(o);return r.right>n.left&&r.lefts(t))))))).getOr(fm.none("default")),cata:(e,t,o,n,r)=>e.fold(t,o,n,r)},pm=It("br"),bm=(e,t,o)=>t(e,o).bind((e=>Wt(e)&&0===Jo(e).trim().length?bm(e,t,o):C.some(e))),wm=(e,t,o,n)=>((e,t)=>Yt(e,t).filter(pm).orThunk((()=>Yt(e,t-1).filter(pm))))(t,o).bind((t=>n.traverse(t).fold((()=>bm(t,n.gather,e).map(n.relative)),(e=>(e=>$t(e).bind((t=>{const o=Kt(t);return((e,t)=>M(e,b(Je,t)))(o,e).map((n=>((e,t,o,n)=>({parent:e,children:t,element:o,index:n}))(t,o,e,n)))})))(e).map((e=>kn.on(e.parent,e.index))))))),vm=(e,t)=>({left:e.left,top:e.top+t,right:e.right,bottom:e.bottom+t}),ym=(e,t)=>({left:e.left,top:e.top-t,right:e.right,bottom:e.bottom-t}),xm=(e,t,o)=>({left:e.left+t,top:e.top+o,right:e.right+t,bottom:e.bottom+o}),Cm=e=>({left:e.left,top:e.top,right:e.right,bottom:e.bottom}),Sm=(e,t)=>C.some(e.getRect(t)),Tm=(e,t,o)=>Mt(t)?Sm(e,t).map(Cm):Wt(t)?((e,t,o)=>o>=0&&o0?e.getRangedRect(t,o-1,t,o):C.none())(e,t,o).map(Cm):C.none(),Rm=(e,t)=>Mt(t)?Sm(e,t).map(Cm):Wt(t)?e.getRangedRect(t,0,t,yn(t)).map(Cm):C.none(),Dm=Z([{none:[]},{retry:["caret"]}]),Om=(e,t,o)=>nn(t,ta).fold(y,(t=>Rm(e,t).exists((e=>((e,t)=>e.leftt.right)(o,e))))),km={point:e=>e.bottom,adjuster:(e,t,o,n,r)=>{const s=vm(r,5);return Math.abs(o.bottom-n.bottom)<1||o.top>r.bottom?Dm.retry(s):o.top===r.bottom?Dm.retry(vm(r,1)):Om(e,t,r)?Dm.retry(xm(s,5,0)):Dm.none()},move:vm,gather:Kl},Em=(e,t,o,n,r)=>0===r?C.some(n):((e,t,o)=>e.elementFromPoint(t,o).filter((e=>"table"===Bt(e))).isSome())(e,n.left,t.point(n))?((e,t,o,n,r)=>Em(e,t,o,t.move(n,5),r))(e,t,o,n,r-1):e.situsFromPoint(n.left,t.point(n)).bind((s=>s.start.fold(C.none,(s=>Rm(e,s).bind((l=>t.adjuster(e,s,l,o,n).fold(C.none,(n=>Em(e,t,o,n,r-1))))).orThunk((()=>C.some(n)))),C.none))),Nm=(e,t,o)=>{const n=e.move(o,5),r=Em(t,e,o,n,100).getOr(n);return((e,t,o)=>e.point(t)>o.getInnerHeight()?C.some(e.point(t)-o.getInnerHeight()):e.point(t)<0?C.some(-e.point(t)):C.none())(e,r,t).fold((()=>t.situsFromPoint(r.left,e.point(r))),(o=>(t.scrollBy(0,o),t.situsFromPoint(r.left,e.point(r)-o))))},Bm={tryUp:b(Nm,{point:e=>e.top,adjuster:(e,t,o,n,r)=>{const s=ym(r,5);return Math.abs(o.top-n.top)<1||o.bottome.getSelection().bind((n=>((e,t,o,n)=>{const r=pm(t)?((e,t,o)=>o.traverse(t).orThunk((()=>bm(t,o.gather,e))).map(o.relative))(e,t,n):wm(e,t,o,n);return r.map((e=>({start:e,finish:e})))})(t,n.finish,n.foffset,o).fold((()=>C.some(Wl(n.finish,n.foffset))),(r=>{const s=e.fromSitus(r);return l=hm.verify(e,n.finish,n.foffset,s.finish,s.foffset,o.failure,t),hm.cata(l,(e=>C.none()),(()=>C.none()),(e=>C.some(Wl(e,0))),(e=>C.some(Wl(e,yn(e)))));var l})))),zm=(e,t,o,n,r,s)=>0===s?C.none():Mm(e,t,o,n,r).bind((l=>{const a=e.fromSitus(l),c=hm.verify(e,o,n,a.finish,a.foffset,r.failure,t);return hm.cata(c,(()=>C.none()),(()=>C.some(l)),(l=>Je(o,l)&&0===n?Am(e,o,n,ym,r):zm(e,t,l,0,r,s-1)),(l=>Je(o,l)&&n===yn(l)?Am(e,o,n,vm,r):zm(e,t,l,yn(l),r,s-1)))})),Am=(e,t,o,n,r)=>Tm(e,t,o).bind((t=>Lm(e,r,n(t,Bm.getJumpSize())))),Lm=(e,t,o)=>{const n=kt().browser;return n.isChromium()||n.isSafari()||n.isFirefox()?t.retry(e,o):C.none()},Mm=(e,t,o,n,r)=>Tm(e,o,n).bind((t=>Lm(e,r,t))),Wm=(e,t,o,n,r)=>an(n,"td,th",t).bind((n=>an(n,"table",t).bind((s=>((e,t)=>on(e,(e=>$t(e).exists((e=>Je(e,t)))),void 0).isSome())(r,s)?((e,t,o)=>_m(e,t,o).bind((n=>zm(e,t,n.element,n.offset,o,20).map(e.fromSitus))))(e,t,o).bind((e=>an(e.finish,"td,th",t).map((t=>({start:n,finish:t,range:e}))))):C.none())))),jm=(e,t,o,n,r,s)=>s(n,t).orThunk((()=>Wm(e,t,o,n,r).map((e=>{const t=e.range;return sm(C.some(dm(t.start,t.soffset,t.finish,t.foffset)),!0)})))),Pm=(e,t)=>an(e,"tr",t).bind((e=>an(e,"table",t).bind((o=>{const n=vn(o,"tr");return Je(e,n[0])?((e,t,o)=>Vl(Ul,e,(e=>Tn(e).isSome()),o))(o,0,t).map((e=>{const t=yn(e);return sm(C.some(dm(e,t,e,t)),!0)})):C.none()})))),Im=(e,t)=>an(e,"tr",t).bind((e=>an(e,"table",t).bind((o=>{const n=vn(o,"tr");return Je(e,n[n.length-1])?((e,t,o)=>ql(Ul,e,(e=>Sn(e).isSome()),o))(o,0,t).map((e=>sm(C.some(dm(e,0,e,0)),!0))):C.none()})))),Fm=(e,t,o,n,r,s,l)=>Wm(e,o,n,r,s).bind((e=>um(t,o,e.start,e.finish,l))),Hm=(e,t)=>an(e,"td,th",t),$m=e=>Vt(e).exists(gn),Vm={traverse:Gt,gather:Kl,relative:kn.before,retry:Bm.tryDown,failure:hm.failedDown},qm={traverse:Ut,gather:Gl,relative:kn.before,retry:Bm.tryUp,failure:hm.failedUp},Um=e=>t=>t===e,Gm=Um(38),Km=Um(40),Ym=e=>e>=37&&e<=40,Jm={isBackward:Um(37),isForward:Um(39)},Qm={isBackward:Um(39),isForward:Um(37)},Xm=e=>({elementFromPoint:(t,o)=>Me.fromPoint(Me.fromDom(e.document),t,o),getRect:e=>e.dom.getBoundingClientRect(),getRangedRect:(t,o,n,r)=>{const s=Nn.exact(t,o,n,r);return((e,t)=>(e=>{const t=e.getClientRects(),o=t.length>0?t[0]:e.getBoundingClientRect();return o.width>0||o.height>0?C.some(o).map(He):C.none()})(Ue(e,t)))(e,s)},getSelection:()=>Fn(e).map((t=>mm(e,t))),fromSitus:t=>{const o=Nn.relative(t.start,t.finish);return mm(e,o)},situsFromPoint:(t,o)=>Hn(e,t,o).map((e=>im(e.start,e.soffset,e.finish,e.foffset))),clearSelection:()=>{(e=>{_n(e).each((e=>e.removeAllRanges()))})(e)},collapseSelection:(t=!1)=>{Fn(e).each((o=>o.fold((e=>e.collapse(t)),((o,n)=>{const r=t?o:n;Wn(e,r,r)}),((o,n,r,s)=>{const l=t?o:r,a=t?n:s;Mn(e,l,a,l,a)}))))},setSelection:t=>{Mn(e,t.start,t.soffset,t.finish,t.foffset)},setRelativeSelection:(t,o)=>{Wn(e,t,o)},selectNode:t=>{In(e,t,!1)},selectContents:t=>{In(e,t)},getInnerHeight:()=>e.innerHeight,getScrollY:()=>(e=>{const t=void 0!==e?e.dom:document,o=t.body.scrollLeft||t.documentElement.scrollLeft,n=t.body.scrollTop||t.documentElement.scrollTop;return qo(o,n)})(Me.fromDom(e.document)).top,scrollBy:(t,o)=>{((e,t,o)=>{const n=(void 0!==o?o.dom:document).defaultView;n&&n.scrollBy(e,t)})(t,o,Me.fromDom(e.document))}}),Zm=(e,t)=>({rows:e,cols:t}),ed=e=>nn(e,Lt).exists(gn),td=(e,t)=>ed(e)||ed(t),od="data-mce-selected",nd="data-mce-first-selected",rd="data-mce-last-selected",sd="["+od+"]",ld={selected:od,selectedSelector:"td["+od+"],th["+od+"]",firstSelected:nd,firstSelectedSelector:"td["+nd+"],th["+nd+"]",lastSelected:rd,lastSelectedSelector:"td["+rd+"],th["+rd+"]"},ad=(e,t,o)=>({element:o,mergable:rm(t,e,ld),unmergable:nm(e),selection:om(e)}),cd=e=>(t,o)=>{const n=Bt(t),r="col"===n||"colgroup"===n?ir(s=t).bind((e=>em(e,ld.firstSelectedSelector))).fold(g(s),(e=>e[0])):t;var s;return an(r,e,o)},id=cd("th,td,caption"),md=cd("th,td"),dd=e=>{return t=e.model.table.getSelectedCells(),E(t,Me.fromDom);var t},ud=(e,t)=>{e.on("BeforeGetContent",(t=>{const o=o=>{t.preventDefault(),(e=>ir(e[0]).map((e=>{const t=((e,t)=>{const o=e=>Ge(e.element,t),n=To(e),r=vr(n),s=As(e),l=Or(r),a=((e,t)=>{const o=e.grid.columns;let n=e.grid.rows,r=o,s=0,l=0;const a=[],c=[];return G(e.access,(e=>{if(a.push(e),t(e)){c.push(e);const t=e.row,o=t+e.rowspan-1,a=e.column,i=a+e.colspan-1;ts&&(s=o),al&&(l=i)}})),((e,t,o,n,r,s)=>({minRow:e,minCol:t,maxRow:o,maxCol:n,allCells:r,selectedCells:s}))(n,r,s,l,a,c)})(l,o),c="th:not("+t+"),td:not("+t+")",i=sr(n,"th,td",(e=>Ge(e,c)));N(i,yo),((e,t,o,n)=>{const r=_(e,(e=>"colgroup"!==e.section)),s=t.grid.columns,l=t.grid.rows;for(let e=0;eo.maxRow||ao.maxCol||(kr(t,e,a).filter(n).isNone()?al(r,l,e):l=!0)}})(r,l,a,o);const m=((e,t,o,n)=>{if(0===n.minCol&&t.grid.columns===n.maxCol+1)return 0;const r=Es(t,e,o),s=A(r,((e,t)=>e+t),0),l=A(r.slice(n.minCol,n.maxCol+1),((e,t)=>e+t),0),a=l/s*o.pixelWidth()-o.pixelWidth();return o.getCellDelta(a)})(e,Dr(e),s,a);return((e,t,o,n)=>{G(o.columns,(e=>{(e.columnt.maxCol)&&yo(e.element)}));const r=_(rr(e,"tr"),(e=>0===e.dom.childElementCount));N(r,yo),t.minCol!==t.maxCol&&t.minRow!==t.maxRow||N(rr(e,"th,td"),(e=>{bo(e,"rowspan"),bo(e,"colspan")})),bo(e,yr),bo(e,"data-snooker-col-series"),As(e).adjustTableWidth(n)})(n,a,l,m),n})(e,sd);return Fi(t),[t]})))(o).each((o=>{const n="text"===t.format?((e,t)=>{const o=e.getDoc(),n=Qt(Me.fromDom(e.getBody())),r=Me.fromTag("div",o);fo(r,"data-mce-bogus","all"),No(r,{position:"fixed",left:"-9999999px",top:"0",overflow:"hidden",opacity:"0"});const s=(e=>Jt(e)?e:Me.fromDom(Ht(e).dom.body))(n);mo(r,t),ao(s,r);const l=r.dom.innerText;return yo(r),l})(e,o):((e,t)=>E(t,(t=>e.selection.serializer.serialize(t.dom,{}))).join(""))(e,o);t.content=n}))};if(!0===t.selection){const t=(e=>_(dd(e),(e=>Ge(e,ld.selectedSelector))))(e);t.length>=1&&o(t)}})),e.on("BeforeSetContent",(o=>{if(!0===o.selection&&!0===o.paste){const n=dd(e);H(n).each((n=>{ir(n).each((r=>{const s=_((e=>{const t=document.createElement("div");return t.innerHTML=e,Kt(Me.fromDom(t))})(o.content),(e=>"meta"!==Bt(e))),l=It("table");if(Mi(e)&&1===s.length&&l(s[0])){o.preventDefault();const l=Me.fromDom(e.getDoc()),a=pa(l),c=((e,t,o)=>({element:e,clipboard:t,generators:o}))(n,s[0],a);t.pasteCells(r,c).each((()=>{e.focus()}))}}))}))}}))},fd=(e,t)=>e.dispatch("NewRow",{node:t}),gd=(e,t)=>e.dispatch("NewCell",{node:t}),hd=(e,t,o)=>{e.dispatch("TableModified",{...o,table:t})},pd={structure:!1,style:!0},bd={structure:!0,style:!1},wd={structure:!0,style:!0},vd=(e,t)=>Bi(e)?Ms(t):_i(e)?Ls(t):As(t),yd=(e,t,o)=>{const n=e=>"table"===Bt(Pi(e)),r=Ri(e),s=Ei(e)?f:rl,l=t=>{switch(Di(e)){case"section":return Ir();case"sectionCells":return Fr();case"cells":return Hr();default:return((e,t)=>{var o;switch((o=Dr(e),V(o.all,(e=>{const t=hr(e);return"header"===t.type?C.from(t.subType):C.none()}))).getOr(t)){case"section":return Wr();case"sectionCells":return jr();case"cells":return Pr()}})(t,"section")}},a=(n,s,a,c)=>(i,m,d=!1)=>{Fi(i);const u=Me.fromDom(e.getDoc()),f=ha(a,u,r),g={sizing:vd(e,i),resize:Ei(e)?Jn():Qn(),section:l(i)};return s(i)?n(i,m,f,g).bind((n=>{t.refresh(i.dom),N(n.newRows,(t=>{fd(e,t.dom)})),N(n.newCells,(t=>{gd(e,t.dom)}));const r=((t,n)=>n.cursor.fold((()=>{const n=ar(t);return H(n).filter(Oo).map((n=>{o.clearSelectedCells(t.dom);const r=e.dom.createRng();return r.selectNode(n.dom),e.selection.setRng(r),fo(n,"data-mce-selected","1"),r}))}),(n=>{const r=Fl(Hl,n),s=e.dom.createRng();return s.setStart(r.element.dom,r.offset),s.setEnd(r.element.dom,r.offset),e.selection.setRng(s),o.clearSelectedCells(t.dom),C.some(s)})))(i,n);return Oo(i)&&(Fi(i),d||hd(e,i.dom,c)),r.map((e=>({rng:e,effect:c})))})):C.none()},c=a(Oc,(t=>!n(e)||ba(t).rows>1),f,bd),i=a(Dc,(t=>!n(e)||ba(t).columns>1),f,bd);return{deleteRow:c,deleteColumn:i,insertRowsBefore:a(Cc,x,f,bd),insertRowsAfter:a(Sc,x,f,bd),insertColumnsBefore:a(Tc,x,s,bd),insertColumnsAfter:a(Rc,x,s,bd),mergeCells:a(Lc,x,f,bd),unmergeCells:a(Mc,x,f,bd),pasteColsBefore:a(jc,x,f,bd),pasteColsAfter:a(Pc,x,f,bd),pasteRowsBefore:a(Ic,x,f,bd),pasteRowsAfter:a(Fc,x,f,bd),pasteCells:a(Wc,x,f,wd),makeCellsHeader:a(zc,x,f,bd),unmakeCellsHeader:a(Ac,x,f,bd),makeColumnsHeader:a(kc,x,f,bd),unmakeColumnsHeader:a(Ec,x,f,bd),makeRowsHeader:a(Nc,x,f,bd),makeRowsBody:a(Bc,x,f,bd),makeRowsFooter:a(_c,x,f,bd),getTableRowType:Vc,getTableCellType:$c,getTableColType:Hc}},xd=(e,t)=>{e.selection.select(t.dom,!0),e.selection.collapse(!0)},Cd=(e,t,o,n,s)=>{const l=(e=>{const t=e.options,o=t.get("table_default_styles");return t.isSet("table_default_styles")?o:((e,t)=>zi(e)||!Li(e)?t:_i(e)?{...t,width:Ti(e)}:{...t,width:Si})(e,o)})(e),a={styles:l,attributes:Wi(e),colGroups:ji(e)};return e.undoManager.ignore((()=>{const r=((e,t,o,n,r,s=Zc)=>{const l=Me.fromTag("table"),a="cells"!==r;No(l,s.styles),go(l,s.attributes),s.colGroups&&ao(l,(e=>{const t=Me.fromTag("colgroup");return k(e,(()=>ao(t,Me.fromTag("col")))),t})(t));const c=Math.min(e,o);if(a&&o>0){const e=Me.fromTag("thead");ao(l,e);const s=ei(o,t,"sectionCells"===r?c:0,n);mo(e,s)}const i=Me.fromTag("tbody");ao(l,i);const m=ei(a?e-c:e,t,a?0:o,n);return mo(i,m),l})(o,t,s,n,Di(e),a);fo(r,"data-mce-id","__mce");const l=(e=>{const t=Me.fromTag("div"),o=Me.fromDom(e.dom.cloneNode(!0));return ao(t,o),(e=>e.dom.innerHTML)(t)})(r);e.insertContent(l),e.addVisual()})),ln(Pi(e),'table[data-mce-id="__mce"]').map((t=>(_i(e)?la(t):zi(e)?aa(t):(Bi(e)||(e=>r(e)&&-1!==e.indexOf("%"))(l.width))&&sa(t),Fi(t),bo(t,"data-mce-id"),((e,t)=>{N(vn(t,"tr"),(t=>{fd(e,t.dom),N(vn(t,"th,td"),(t=>{gd(e,t.dom)}))}))})(e,t),((e,t)=>{ln(t,"td,th").each(b(xd,e))})(e,t),t.dom))).getOrNull()};var Sd=tinymce.util.Tools.resolve("tinymce.FakeClipboard");const Td="x-tinymce/dom-table-",Rd=Td+"rows",Dd=Td+"columns",Od=e=>{const t=Sd.FakeClipboardItem(e);Sd.write([t])},kd=e=>{var t;const o=null!==(t=Sd.read())&&void 0!==t?t:[];return V(o,(t=>C.from(t.getType(e))))},Ed=e=>{kd(e).isSome()&&Sd.clear()},Nd=e=>{e.fold(_d,(e=>Od({[Rd]:e})))},Bd=()=>kd(Rd),_d=()=>Ed(Rd),zd=e=>{e.fold(Ld,(e=>Od({[Dd]:e})))},Ad=()=>kd(Dd),Ld=()=>Ed(Dd),Md=e=>id(Hi(e),Ii(e)).filter(Ki),Wd=(e,t)=>{const o=Ii(e),n=e=>ir(e,o),l=t=>(e=>md(Hi(e),Ii(e)).filter(Ki))(e).bind((e=>n(e).map((o=>t(o,e))))),a=t=>{e.focus()},c=(t,o=!1)=>l(((n,r)=>{const s=ad(dd(e),n,r);t(n,s,o).each(a)})),i=()=>l(((t,o)=>((e,t,o)=>{const n=Dr(e);return Ys(n,t).bind((e=>{const t=Hs(n,o,!1),r=ze(t).rows.slice(e[0].row,e[e.length-1].row+e[e.length-1].rowspan),s=j(r,(e=>{const t=_(e.cells,(e=>!e.isLocked));return t.length>0?[{...e,cells:t}]:[]})),l=$s(s);return de(l.length>0,l)})).map((e=>E(e,(e=>{const t=So(e.element);return N(e.cells,(e=>{const o=To(e.element);Ws(o,"colspan",e.colspan,1),Ws(o,"rowspan",e.rowspan,1),ao(t,o)})),t}))))})(t,ad(dd(e),t,o),ha(f,Me.fromDom(e.getDoc()),C.none())))),m=()=>l(((t,o)=>((e,t)=>{const o=Dr(e);return Js(o,t).map((e=>{const t=e[e.length-1],n=e[0].column,r=t.column+t.colspan,s=((e,t,o)=>{if(zr(e)){const n=_(_r(e),ll(t,o)),r=E(n,(e=>{const n=To(e.element);return sl(n,"span",o-t),n})),s=Me.fromTag("colgroup");return mo(s,r),[s]}return[]})(o,n,r),l=((e,t,o)=>E(e.all,(e=>{const n=_(e.cells,ll(t,o)),r=E(n,(e=>{const n=To(e.element);return sl(n,"colspan",o-t),n})),s=Me.fromTag("tr");return mo(s,r),s})))(o,n,r);return[...s,...l]}))})(t,ad(dd(e),t,o)))),d=(t,o)=>o().each((o=>{const n=E(o,(e=>To(e)));l(((o,r)=>{const s=pa(Me.fromDom(e.getDoc())),l=((e,t,o,n)=>({selection:om(e),clipboard:o,generators:n}))(dd(e),0,n,s);t(o,l).each(a)}))})),g=e=>(t,o)=>((e,t)=>X(e,t)?C.from(e[t]):C.none())(o,"type").each((t=>{c(e(t),o.no_events)}));G({mceTableSplitCells:()=>c(t.unmergeCells),mceTableMergeCells:()=>c(t.mergeCells),mceTableInsertRowBefore:()=>c(t.insertRowsBefore),mceTableInsertRowAfter:()=>c(t.insertRowsAfter),mceTableInsertColBefore:()=>c(t.insertColumnsBefore),mceTableInsertColAfter:()=>c(t.insertColumnsAfter),mceTableDeleteCol:()=>c(t.deleteColumn),mceTableDeleteRow:()=>c(t.deleteRow),mceTableCutCol:()=>m().each((e=>{zd(e),c(t.deleteColumn)})),mceTableCutRow:()=>i().each((e=>{Nd(e),c(t.deleteRow)})),mceTableCopyCol:()=>m().each((e=>zd(e))),mceTableCopyRow:()=>i().each((e=>Nd(e))),mceTablePasteColBefore:()=>d(t.pasteColsBefore,Ad),mceTablePasteColAfter:()=>d(t.pasteColsAfter,Ad),mceTablePasteRowBefore:()=>d(t.pasteRowsBefore,Bd),mceTablePasteRowAfter:()=>d(t.pasteRowsAfter,Bd),mceTableDelete:()=>Md(e).each((t=>{ir(t,o).filter(w(o)).each((t=>{const o=Me.fromText("");if(so(t,o),yo(t),e.dom.isEmpty(e.getBody()))e.setContent(""),e.selection.setCursorLocation();else{const t=e.dom.createRng();t.setStart(o.dom,0),t.setEnd(o.dom,0),e.selection.setRng(t),e.nodeChanged()}}))})),mceTableCellToggleClass:(t,o)=>{l((t=>{const n=dd(e),r=P(n,(t=>e.formatter.match("tablecellclass",{value:o},t.dom))),s=r?e.formatter.remove:e.formatter.apply;N(n,(e=>s("tablecellclass",{value:o},e.dom))),hd(e,t.dom,pd)}))},mceTableToggleClass:(t,o)=>{l((t=>{e.formatter.toggle("tableclass",{value:o},t.dom),hd(e,t.dom,pd)}))},mceTableToggleCaption:()=>{Md(e).each((t=>{ir(t,o).each((o=>{sn(o,"caption").fold((()=>{const t=Me.fromTag("caption");ao(t,Me.fromText("Caption")),((e,t)=>{Yt(e,0).fold((()=>{ao(e,t)}),(e=>{ro(e,t)}))})(o,t),e.selection.setCursorLocation(t.dom,0)}),(n=>{It("caption")(t)&&Ye("td",o).each((t=>e.selection.setCursorLocation(t.dom,0))),yo(n)})),hd(e,o.dom,bd)}))}))},mceTableSizingMode:(t,n)=>(t=>Md(e).each((n=>{zi(e)||_i(e)||Bi(e)||ir(n,o).each((o=>{"relative"!==t||Rl(o)?"fixed"!==t||Dl(o)?"responsive"!==t||Ol(o)||aa(o):la(o):sa(o),Fi(o),hd(e,o.dom,bd)}))})))(n),mceTableCellType:g((e=>"th"===e?t.makeCellsHeader:t.unmakeCellsHeader)),mceTableColType:g((e=>"th"===e?t.makeColumnsHeader:t.unmakeColumnsHeader)),mceTableRowType:g((e=>{switch(e){case"header":return t.makeRowsHeader;case"footer":return t.makeRowsFooter;default:return t.makeRowsBody}}))},((t,o)=>e.addCommand(o,t))),e.addCommand("mceInsertTable",((t,o)=>{((e,t,o,n={})=>{const r=e=>u(e)&&e>0;if(r(t)&&r(o)){const r=n.headerRows||0,s=n.headerColumns||0;return Cd(e,o,t,s,r)}console.error("Invalid values for mceInsertTable - rows and columns values are required to insert a table.")})(e,o.rows,o.columns,o.options)})),e.addCommand("mceTableApplyCellStyle",((t,o)=>{const l=e=>"tablecell"+e.toLowerCase().replace("-","");if(!s(o))return;const a=_(dd(e),Ki);if(0===a.length)return;const c=((e,t)=>{const o={};return((e,t,o,n)=>{G(e,((e,r)=>{(t(e,r)?o:n)(e,r)}))})(e,t,(e=>(t,o)=>{e[o]=t})(o),f),o})(o,((t,o)=>e.formatter.has(l(o))&&r(t)));(e=>{for(const t in e)if(U.call(e,t))return!1;return!0})(c)||(G(c,((t,o)=>{const n=l(o);N(a,(o=>{""===t?e.formatter.remove(n,{value:null},o.dom,!0):e.formatter.apply(n,{value:t},o.dom)}))})),n(a[0]).each((t=>hd(e,t.dom,pd))))}))},jd=e=>!un(Me.fromDom(e.target),"ephox-snooker-resizer-bar"),Pd=(e,t)=>{const o=(r=ld.selectedSelector,{get:()=>em(Me.fromDom(e.getBody()),r).fold((()=>md(Hi(e),Ii(e)).fold(lm,cm)),am)}),n=((e,t,o)=>{const n=t=>{bo(t,e.selected),bo(t,e.firstSelected),bo(t,e.lastSelected)},r=t=>{fo(t,e.selected,"1")},s=e=>{l(e),o()},l=t=>{const o=vn(t,`${e.selectedSelector},${e.firstSelectedSelector},${e.lastSelectedSelector}`);N(o,n)};return{clearBeforeUpdate:l,clear:s,selectRange:(o,n,l,a)=>{s(o),N(n,r),fo(l,e.firstSelected,"1"),fo(a,e.lastSelected,"1"),t(n,l,a)},selectedSelector:e.selectedSelector,firstSelectedSelector:e.firstSelectedSelector,lastSelectedSelector:e.lastSelectedSelector}})(ld,((t,o,n)=>{ir(o).each((r=>{const s=E(t,(e=>e.dom)),l=Ri(e),a=ha(f,Me.fromDom(e.getDoc()),l),c=((e,t,o)=>{const n=Dr(e);return Ys(n,t).map((e=>{const t=Hs(n,o,!1),{rows:r}=ze(t),s=((e,t)=>{const o=e.slice(0,t[t.length-1].row+1),n=$s(o);return j(n,(e=>{const o=e.cells.slice(0,t[t.length-1].column+1);return E(o,(e=>e.element))}))})(r,e),l=((e,t)=>{const o=e.slice(t[0].row+t[0].rowspan-1,e.length),n=$s(o);return j(n,(e=>{const o=e.cells.slice(t[0].column+t[0].colspan-1,e.cells.length);return E(o,(e=>e.element))}))})(r,e);return{upOrLeftCells:s,downOrRightCells:l}}))})(r,{selection:dd(e)},a).map((e=>K(e,(e=>E(e,(e=>e.dom)))))).getOrUndefined();((e,t,o,n,r)=>{e.dispatch("TableSelectionChange",{cells:t,start:o,finish:n,otherCells:r})})(e,s,o.dom,n.dom,c)}))}),(()=>(e=>{e.dispatch("TableSelectionClear")})(e)));var r;return e.on("init",(o=>{const r=e.getWin(),s=Pi(e),l=Ii(e),a=((e,t,o,n)=>{const r=((e,t,o,n)=>{const r=fe(),s=r.clear,l=s=>{r.on((r=>{n.clearBeforeUpdate(t),Hm(s.target,o).each((l=>{Ji(r,l,o).each((o=>{const r=o.boxes.getOr([]);if(1===r.length){const e=r[0],o="false"===hn(e),l=ie(fn(s.target),e,Je);o&&l&&n.selectRange(t,r,e,e)}else r.length>1&&(n.selectRange(t,r,o.start,o.finish),e.selectContents(l))}))}))}))};return{clearstate:s,mousedown:e=>{n.clear(t),Hm(e.target,o).filter($m).each(r.set)},mouseover:e=>{l(e)},mouseup:e=>{l(e),s()}}})(Xm(e),t,o,n);return{clearstate:r.clearstate,mousedown:r.mousedown,mouseover:r.mouseover,mouseup:r.mouseup}})(r,s,l,n),c=((e,t,o,n)=>{const r=Xm(e),s=()=>(n.clear(t),C.none());return{keydown:(e,l,a,c,i,m)=>{const d=e.raw,u=d.which,f=!0===d.shiftKey,g=Qi(t,n.selectedSelector).fold((()=>(Ym(u)&&!f&&n.clearBeforeUpdate(t),Ym(u)&&f&&!td(l,c)?C.none:Km(u)&&f?b(Fm,r,t,o,Vm,c,l,n.selectRange):Gm(u)&&f?b(Fm,r,t,o,qm,c,l,n.selectRange):Km(u)?b(jm,r,o,Vm,c,l,Im):Gm(u)?b(jm,r,o,qm,c,l,Pm):C.none)),(e=>{const o=o=>()=>{const s=V(o,(o=>((e,t,o,n,r)=>Zi(n,e,t,r.firstSelectedSelector,r.lastSelectedSelector).map((e=>(r.clearBeforeUpdate(o),r.selectRange(o,e.boxes,e.start,e.finish),e.boxes))))(o.rows,o.cols,t,e,n)));return s.fold((()=>Xi(t,n.firstSelectedSelector,n.lastSelectedSelector).map((e=>{const o=Km(u)||m.isForward(u)?kn.after:kn.before;return r.setRelativeSelection(kn.on(e.first,0),o(e.table)),n.clear(t),sm(C.none(),!0)}))),(e=>C.some(sm(C.none(),!0))))};return Ym(u)&&f&&!td(l,c)?C.none:Km(u)&&f?o([Zm(1,0)]):Gm(u)&&f?o([Zm(-1,0)]):m.isBackward(u)&&f?o([Zm(0,-1),Zm(-1,0)]):m.isForward(u)&&f?o([Zm(0,1),Zm(1,0)]):Ym(u)&&!f?s:C.none}));return g()},keyup:(e,r,s,l,a)=>Qi(t,n.selectedSelector).fold((()=>{const c=e.raw,i=c.which;return!0===c.shiftKey&&Ym(i)&&td(r,l)?((e,t,o,n,r,s,l)=>Je(o,r)&&n===s?C.none():an(o,"td,th",t).bind((o=>an(r,"td,th",t).bind((n=>um(e,t,o,n,l))))))(t,o,r,s,l,a,n.selectRange):C.none()}),C.none)}})(r,s,l,n),i=((e,t,o,n)=>{const r=Xm(e);return(e,s)=>{n.clearBeforeUpdate(t),Ji(e,s,o).each((e=>{const o=e.boxes.getOr([]);n.selectRange(t,o,e.start,e.finish),r.selectContents(s),r.collapseSelection()}))}})(r,s,l,n);e.on("TableSelectorChange",(e=>i(e.start,e.finish)));const m=(t,o)=>{(e=>!0===e.raw.shiftKey)(t)&&(o.kill&&t.kill(),o.selection.each((t=>{const o=Nn.relative(t.start,t.finish),n=Ue(r,o);e.selection.setRng(n)})))},d=e=>0===e.button,u=(()=>{const e=ee(Me.fromDom(s)),t=ee(0);return{touchEnd:o=>{const n=Me.fromDom(o.target);if(It("td")(n)||It("th")(n)){const r=e.get(),s=t.get();Je(r,n)&&o.timeStamp-s<300&&(o.preventDefault(),i(n,n))}e.set(n),t.set(o.timeStamp)}}})();e.on("dragstart",(e=>{a.clearstate()})),e.on("mousedown",(e=>{d(e)&&jd(e)&&a.mousedown(no(e))})),e.on("mouseover",(e=>{var t;(void 0===(t=e).buttons||1&t.buttons)&&jd(e)&&a.mouseover(no(e))})),e.on("mouseup",(e=>{d(e)&&jd(e)&&a.mouseup(no(e))})),e.on("touchend",u.touchEnd),e.on("keyup",(t=>{const o=no(t);if(o.raw.shiftKey&&Ym(o.raw.which)){const t=e.selection.getRng(),n=Me.fromDom(t.startContainer),r=Me.fromDom(t.endContainer);c.keyup(o,n,t.startOffset,r,t.endOffset).each((e=>{m(o,e)}))}})),e.on("keydown",(o=>{const n=no(o);t.hide();const r=e.selection.getRng(),s=Me.fromDom(r.startContainer),l=Me.fromDom(r.endContainer),a=Zo(Jm,Qm)(Me.fromDom(e.selection.getStart()));c.keydown(n,s,r.startOffset,l,r.endOffset,a).each((e=>{m(n,e)})),t.show()})),e.on("NodeChange",(()=>{const t=e.selection,o=Me.fromDom(t.getStart()),r=Me.fromDom(t.getEnd());Zl(ir,[o,r]).fold((()=>n.clear(s)),f)}))})),e.on("PreInit",(()=>{e.serializer.addTempAttr(ld.firstSelected),e.serializer.addTempAttr(ld.lastSelected)})),{getSelectedCells:()=>((e,t)=>{switch(e.tag){case"none":return t();case"single":return(e=>[e.dom])(e.element);case"multiple":return(e=>E(e,(e=>e.dom)))(e.elements)}})(o.get(),g([])),clearSelectedCells:e=>n.clear(Me.fromDom(e))}},Id=e=>m(e)&&"TABLE"===e.nodeName,Fd="bar-",Hd=e=>"false"!==ho(e,"data-mce-resize"),$d=e=>{const t=fe(),o=fe(),n=fe();let r,s,l,a;const c=t=>vd(e,t),i=()=>ki(e)?Qn():Jn(),m=(t,o,n,m)=>{const d=(e=>{return pe(t=e,"corner-")?(e=>e.substring(7))(t):t;var t})(o),u=be(d,"e"),f=pe(d,"n");if(""===s&&sa(t),""===a&&(e=>{const t=(e=>jo(e)+"px")(e);Tl(e,C.none(),C.some(t)),ra(e)})(t),n!==r&&""!==s){Eo(t,"width",s);const o=i(),l=c(t),a=ki(e)||u?(e=>ba(e).columns)(t)-1:0;ol(t,n-r,a,o,l)}else if((e=>/^(\d+(\.\d+)?)%$/.test(e))(s)){const e=parseFloat(s.replace("%",""));Eo(t,"width",n*e/r+"%")}if((e=>/^(\d+(\.\d+)?)px$/.test(e))(s)&&(e=>{const t=Dr(e);zr(t)||N(ar(e),(e=>{const t=Bo(e,"width");Eo(e,"width",t),bo(e,"width")}))})(t),m!==l&&""!==a){Eo(t,"height",a);const e=f?0:(e=>ba(e).rows)(t)-1;nl(t,m-l,e)}};e.on("init",(()=>{const r=((e,t)=>((e,t)=>({parent:g(e),view:g(e),dragContainer:g(e),origin:()=>Go(e),isResizable:t}))(Me.fromDom(e.getBody()),t))(e,Hd);if(n.set(r),(e=>{const t=e.options.get("object_resizing");return D(t.split(","),"table")})(e)&&Ai(e)){const n=((e,t,o)=>{const n=ns,r=ss,s=xi(e),l=oi({beforeResize:ti(["table","type"]),afterResize:ti(["table","type"]),startDrag:ti([])});return s.events.adjustHeight.bind((e=>{const t=e.table;l.trigger.beforeResize(t,"row");const o=n.delta(e.delta,t);nl(t,o,e.row),l.trigger.afterResize(t,"row")})),s.events.startAdjust.bind((e=>{l.trigger.startDrag()})),s.events.adjustWidth.bind((e=>{const n=e.table;l.trigger.beforeResize(n,"col");const s=r.delta(e.delta,n),a=o(n);ol(n,s,e.column,t,a),l.trigger.afterResize(n,"col")})),{on:s.on,off:s.off,refreshBars:s.refresh,hideBars:s.hideBars,showBars:s.showBars,destroy:s.destroy,events:l.registry}})(r,i(),c);e.mode.isReadOnly()||n.on(),n.events.startDrag.bind((o=>{t.set(e.selection.getRng())})),n.events.beforeResize.bind((t=>{const o=t.table.dom;((e,t,o,n,r)=>{e.dispatch("ObjectResizeStart",{target:t,width:o,height:n,origin:r})})(e,o,$i(o),Vi(o),Fd+t.type)})),n.events.afterResize.bind((o=>{const n=o.table,r=n.dom;Fi(n),t.on((t=>{e.selection.setRng(t),e.focus()})),((e,t,o,n,r)=>{e.dispatch("ObjectResized",{target:t,width:o,height:n,origin:r})})(e,r,$i(r),Vi(r),Fd+o.type),e.undoManager.add()})),o.set(n)}})),e.on("ObjectResizeStart",(t=>{const o=t.target;if(Id(o)&&!e.mode.isReadOnly()){const n=Me.fromDom(o);N(e.dom.select(".mce-clonedresizable"),(t=>{e.dom.addClass(t,"mce-"+Oi(e)+"-columns")})),!Dl(n)&&_i(e)?la(n):!Rl(n)&&Bi(e)&&sa(n),Ol(n)&&pe(t.origin,Fd)&&sa(n),r=t.width,s=zi(e)?"":Ui(e,o).getOr(""),l=t.height,a=Gi(e,o).getOr("")}})),e.on("ObjectResized",(t=>{const o=t.target;if(Id(o)){const n=Me.fromDom(o),r=t.origin;(e=>pe(e,"corner-"))(r)&&m(n,r,t.width,t.height),Fi(n),hd(e,n.dom,pd)}}));const d=()=>{o.on((e=>{e.on(),e.showBars()}))},u=()=>{o.on((e=>{e.off(),e.hideBars()}))};return e.on("DisabledStateChange",(e=>{e.state?u():d()})),e.on("SwitchMode",(()=>{e.mode.isReadOnly()?u():d()})),e.on("dragstart dragend",(e=>{"dragstart"===e.type?u():d()})),e.on("remove",(()=>{o.on((e=>{e.destroy()}))})),{refresh:e=>{o.on((t=>t.refreshBars(Me.fromDom(e))))},hide:()=>{o.on((e=>e.hideBars()))},show:()=>{o.on((e=>e.showBars()))}}},Vd=e=>{(e=>{const t=e.options.register;t("table_clone_elements",{processor:"string[]"}),t("table_use_colgroups",{processor:"boolean",default:!0}),t("table_header_type",{processor:e=>{const t=D(["section","cells","sectionCells","auto"],e);return t?{value:e,valid:t}:{valid:!1,message:"Must be one of: section, cells, sectionCells or auto."}},default:"section"}),t("table_sizing_mode",{processor:"string",default:"auto"}),t("table_default_attributes",{processor:"object",default:{border:"1"}}),t("table_default_styles",{processor:"object",default:{"border-collapse":"collapse"}}),t("table_column_resizing",{processor:e=>{const t=D(["preservetable","resizetable"],e);return t?{value:e,valid:t}:{valid:!1,message:"Must be preservetable, or resizetable."}},default:"preservetable"}),t("table_resize_bars",{processor:"boolean",default:!0}),t("table_style_by_css",{processor:"boolean",default:!0}),t("table_merge_content_on_paste",{processor:"boolean",default:!0})})(e);const t=$d(e),o=Pd(e,t),n=yd(e,t,o);return Wd(e,n),((e,t)=>{const o=Ii(e),n=t=>md(Hi(e)).bind((n=>ir(n,o).map((o=>{const r=ad(dd(e),o,n);return t(o,r)})))).getOr("");G({mceTableRowType:()=>n(t.getTableRowType),mceTableCellType:()=>n(t.getTableCellType),mceTableColType:()=>n(t.getTableColType)},((t,o)=>e.addQueryValueHandler(o,t)))})(e,n),ud(e,n),{getSelectedCells:o.getSelectedCells,clearSelectedCells:o.clearSelectedCells}};e.add("dom",(e=>({table:Vd(e)})))}(); \ No newline at end of file +!function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.ModelManager");const t=e=>t=>(e=>{const t=typeof e;return null===e?"null":"object"===t&&Array.isArray(e)?"array":"object"===t&&(o=n=e,(r=String).prototype.isPrototypeOf(o)||n.constructor?.name===r.name)?"string":t;var o,n,r})(t)===e,o=e=>t=>typeof t===e,n=e=>t=>e===t,r=t("string"),s=t("object"),l=t("array"),a=n(null),c=o("boolean"),i=n(void 0),m=e=>!(e=>null==e)(e),d=o("function"),u=o("number"),f=()=>{},g=e=>()=>e,h=e=>e,p=(e,t)=>e===t;function b(e,...t){return(...o)=>{const n=t.concat(o);return e.apply(null,n)}}const w=e=>t=>!e(t),v=e=>e(),y=g(!1),x=g(!0);class C{tag;value;static singletonNone=new C(!1);constructor(e,t){this.tag=e,this.value=t}static some(e){return new C(!0,e)}static none(){return C.singletonNone}fold(e,t){return this.tag?t(this.value):e()}isSome(){return this.tag}isNone(){return!this.tag}map(e){return this.tag?C.some(e(this.value)):C.none()}bind(e){return this.tag?e(this.value):C.none()}exists(e){return this.tag&&e(this.value)}forall(e){return!this.tag||e(this.value)}filter(e){return!this.tag||e(this.value)?this:C.none()}getOr(e){return this.tag?this.value:e}or(e){return this.tag?this:e}getOrThunk(e){return this.tag?this.value:e()}orThunk(e){return this.tag?this:e()}getOrDie(e){if(this.tag)return this.value;throw new Error(e??"Called getOrDie on None")}static from(e){return m(e)?C.some(e):C.none()}getOrNull(){return this.tag?this.value:null}getOrUndefined(){return this.value}each(e){this.tag&&e(this.value)}toArray(){return this.tag?[this.value]:[]}toString(){return this.tag?`some(${this.value})`:"none()"}}const T=Array.prototype.slice,S=Array.prototype.indexOf,R=Array.prototype.push,D=(e,t)=>{return o=e,n=t,S.call(o,n)>-1;var o,n},O=(e,t)=>{for(let o=0,n=e.length;o{const o=[];for(let n=0;n{const o=e.length,n=new Array(o);for(let r=0;r{for(let o=0,n=e.length;o{const o=[],n=[];for(let r=0,s=e.length;r{const o=[];for(let n=0,r=e.length;n(((e,t)=>{for(let o=e.length-1;o>=0;o--)t(e[o],o)})(e,(e,n)=>{o=t(o,e,n)}),o),A=(e,t,o)=>(_(e,(e,n)=>{o=t(o,e,n)}),o),L=(e,t)=>((e,t,o)=>{for(let n=0,r=e.length;n{for(let o=0,n=e.length;o{const t=[];for(let o=0,n=e.length;oW(E(e,t)),P=(e,t)=>{for(let o=0,n=e.length;o{const o={};for(let n=0,r=e.length;nt>=0&&tF(e,0),$=e=>F(e,e.length-1),V=(e,t)=>{for(let o=0;o{const o=q(e);for(let n=0,r=o.length;nY(e,(e,o)=>({k:o,v:t(e,o)})),Y=(e,t)=>{const o={};return G(e,(e,n)=>{const r=t(e,n);o[r.k]=r.v}),o},J=(e,t)=>{const o=[];return G(e,(e,n)=>{o.push(t(e,n))}),o},Q=e=>J(e,h),X=(e,t)=>U.call(e,t),Z=e=>{if(!l(e))throw new Error("cases must be an array");if(0===e.length)throw new Error("there must be at least one case");const t=[],o={};return _(e,(n,r)=>{const s=q(n);if(1!==s.length)throw new Error("one and only one name per case");const a=s[0],c=n[a];if(void 0!==o[a])throw new Error("duplicate key detected:"+a);if("cata"===a)throw new Error("cannot have a case named cata (sorry)");if(!l(c))throw new Error("case arguments must be an array");t.push(a),o[a]=(...o)=>{const n=o.length;if(n!==c.length)throw new Error("Wrong number of arguments to case "+a+". Expected "+c.length+" ("+c+"), got "+n);return{fold:(...t)=>{if(t.length!==e.length)throw new Error("Wrong number of arguments to fold. Expected "+e.length+", got "+t.length);return t[r].apply(null,o)},match:e=>{const n=q(e);if(t.length!==n.length)throw new Error("Wrong number of arguments to match. Expected: "+t.join(",")+"\nActual: "+n.join(","));if(!P(t,e=>D(n,e)))throw new Error("Not all branches were specified when using match. Specified: "+n.join(", ")+"\nRequired: "+t.join(", "));return e[a].apply(null,o)},log:e=>{console.log(e,{constructors:t,constructor:a,params:o})}}}}),o},ee=e=>{let t=e;return{get:()=>t,set:e=>{t=e}}},te=e=>e.slice(0).sort(),oe=(e,t)=>{const o=B(t,t=>!D(e,t));o.length>0&&(e=>{throw new Error("Unsupported keys for object: "+te(e).join(", "))})(o)},ne=e=>((e,t)=>((e,t,o)=>{if(0===t.length)throw new Error("You must specify at least one required field.");return((e,t)=>{if(!l(t))throw new Error("The "+e+" fields must be an array. Was: "+t+".");_(t,t=>{if(!r(t))throw new Error("The value "+t+" in the "+e+" fields was not a string.")})})("required",t),(e=>{const t=te(e);L(t,(e,o)=>o{throw new Error("The field: "+e+" occurs more than once in the combined fields: ["+t.join(", ")+"].")})})(t),n=>{const r=q(n);P(t,e=>D(r,e))||((e,t)=>{throw new Error("All required keys ("+te(e).join(", ")+") were not specified. Specified keys were: "+te(t).join(", ")+".")})(t,r),e(t,r);const s=B(t,e=>!o.validate(n[e],e));return s.length>0&&((e,t)=>{throw new Error("All values need to be of type: "+t+". Keys ("+te(e).join(", ")+") were not.")})(s,o.label),n}})(e,t,{validate:d,label:"function"}))(oe,e),re=e=>{const t=t=>t(e),o=g(e),n=()=>r,r={tag:!0,inner:e,fold:(t,o)=>o(e),isValue:x,isError:y,map:t=>le.value(t(e)),mapError:n,bind:t,exists:t,forall:t,getOr:o,or:n,getOrThunk:o,orThunk:n,getOrDie:o,each:t=>{t(e)},toOptional:()=>C.some(e)};return r},se=e=>{const t=()=>o,o={tag:!1,inner:e,fold:(t,o)=>t(e),isValue:y,isError:x,map:t,mapError:t=>le.error(t(e)),bind:t,exists:y,forall:x,getOr:h,or:h,getOrThunk:v,orThunk:v,getOrDie:(n=String(e),()=>{throw new Error(n)}),each:f,toOptional:C.none};var n;return o},le={value:re,error:se,fromOption:(e,t)=>e.fold(()=>se(t),re)},ae="undefined"!=typeof window?window:Function("return this;")(),ce=e=>{const t=e.replace(/\./g,"-");return{resolve:e=>t+"-"+e}},ie=(e,t,o=p)=>e.exists(e=>o(e,t)),me=e=>{const t=[],o=e=>{t.push(e)};for(let t=0;te?C.some(t):C.none(),ue=(e,t)=>((e,t)=>{let o=null!=t?t:ae;for(let t=0;t{const e=(e=>{const t=ee(C.none()),o=()=>t.get().each(e);return{clear:()=>{o(),t.set(C.none())},isSet:()=>t.get().isSome(),get:()=>t.get(),set:e=>{o(),t.set(C.some(e))}}})(f);return{...e,on:t=>e.get().each(t)}},ge=(e,t,o)=>""===t||e.length>=t.length&&e.substr(o,o+t.length)===t,he=(e,t,o=0,n)=>{const r=e.indexOf(t,o);return-1!==r&&(!!i(n)||r+t.length<=n)},pe=(e,t)=>ge(e,t,0),be=(e,t)=>ge(e,t,e.length-t.length),we=(e=>t=>t.replace(e,""))(/^\s+|\s+$/g),ve=e=>e.length>0,ye=e=>{let t,o=!1;return(...n)=>(o||(o=!0,t=e.apply(null,n)),t)},xe=["tfoot","thead","tbody","colgroup"],Ce=(e,t,o)=>({element:e,rowspan:t,colspan:o}),Te=(e,t,o)=>({element:e,cells:t,section:o}),Se=(e,t,o)=>({element:e,isNew:t,isLocked:o}),Re=(e,t,o,n)=>({element:e,cells:t,section:o,isNew:n}),De=(e,t,o)=>{const n=e.cells,r=n.slice(0,t),s=n.slice(t),l=r.concat(o).concat(s);return Ee(e,l)},Oe=(e,t,o)=>De(e,t,[o]),ke=(e,t,o)=>{e.cells[t]=o},Ee=(e,t)=>Re(e.element,t,e.section,e.isNew),_e=(e,t)=>e.cells[t],Ne=(e,t)=>_e(e,t).element,Be=e=>e.cells.length,ze=e=>{const t=N(e,e=>"colgroup"===e.section);return{rows:t.fail,cols:t.pass}},Ae=(e,t,o)=>{const n=E(e.cells,o);return Re(t(e.element),n,e.section,!0)},Le=e=>{if(null==e)throw new Error("Node cannot be null or undefined");return{dom:e}},Me={fromHtml:(e,t)=>{const o=(t||document).createElement("div");if(o.innerHTML=e,!o.hasChildNodes()||o.childNodes.length>1){const t="HTML does not have a single root node";throw console.error(t,e),new Error(t)}return Le(o.childNodes[0])},fromTag:(e,t)=>{const o=(t||document).createElement(e);return Le(o)},fromText:(e,t)=>{const o=(t||document).createTextNode(e);return Le(o)},fromDom:Le,fromPoint:(e,t,o)=>C.from(e.dom.elementFromPoint(t,o)).map(Le)},We=(e,t)=>{const o=e.document.createRange();return o.selectNode(t.dom),o},je=(e,t)=>{const o=e.document.createRange();return Pe(o,t),o},Pe=(e,t)=>e.selectNodeContents(t.dom),Ie=(e,t,o)=>{const n=e.document.createRange();var r;return r=n,t.fold(e=>{r.setStartBefore(e.dom)},(e,t)=>{r.setStart(e.dom,t)},e=>{r.setStartAfter(e.dom)}),((e,t)=>{t.fold(t=>{e.setEndBefore(t.dom)},(t,o)=>{e.setEnd(t.dom,o)},t=>{e.setEndAfter(t.dom)})})(n,o),n},Fe=(e,t,o,n,r)=>{const s=e.document.createRange();return s.setStart(t.dom,o),s.setEnd(n.dom,r),s},He=e=>({left:e.left,top:e.top,right:e.right,bottom:e.bottom,width:e.width,height:e.height}),$e=Z([{ltr:["start","soffset","finish","foffset"]},{rtl:["start","soffset","finish","foffset"]}]),Ve=(e,t,o)=>t(Me.fromDom(o.startContainer),o.startOffset,Me.fromDom(o.endContainer),o.endOffset),qe=(e,t)=>{const o=((e,t)=>t.match({domRange:e=>({ltr:g(e),rtl:C.none}),relative:(t,o)=>({ltr:ye(()=>Ie(e,t,o)),rtl:ye(()=>C.some(Ie(e,o,t)))}),exact:(t,o,n,r)=>({ltr:ye(()=>Fe(e,t,o,n,r)),rtl:ye(()=>C.some(Fe(e,n,r,t,o)))})}))(e,t);return((e,t)=>{const o=t.ltr();return o.collapsed?t.rtl().filter(e=>!1===e.collapsed).map(e=>$e.rtl(Me.fromDom(e.endContainer),e.endOffset,Me.fromDom(e.startContainer),e.startOffset)).getOrThunk(()=>Ve(0,$e.ltr,o)):Ve(0,$e.ltr,o)})(0,o)},Ue=(e,t)=>qe(e,t).match({ltr:(t,o,n,r)=>{const s=e.document.createRange();return s.setStart(t.dom,o),s.setEnd(n.dom,r),s},rtl:(t,o,n,r)=>{const s=e.document.createRange();return s.setStart(n.dom,r),s.setEnd(t.dom,o),s}});$e.ltr,$e.rtl;const Ge=(e,t)=>{const o=e.dom;if(1!==o.nodeType)return!1;{const e=o;if(void 0!==e.matches)return e.matches(t);if(void 0!==e.msMatchesSelector)return e.msMatchesSelector(t);if(void 0!==e.webkitMatchesSelector)return e.webkitMatchesSelector(t);if(void 0!==e.mozMatchesSelector)return e.mozMatchesSelector(t);throw new Error("Browser lacks native selectors")}},Ke=e=>1!==e.nodeType&&9!==e.nodeType&&11!==e.nodeType||0===e.childElementCount,Ye=(e,t)=>{const o=void 0===t?document:t.dom;return Ke(o)?C.none():C.from(o.querySelector(e)).map(Me.fromDom)},Je=(e,t)=>e.dom===t.dom,Qe=(e,t)=>{const o=e.dom,n=t.dom;return o!==n&&o.contains(n)},Xe=Ge,Ze=()=>et(0,0),et=(e,t)=>({major:e,minor:t}),tt={nu:et,detect:(e,t)=>{const o=String(t).toLowerCase();return 0===e.length?Ze():((e,t)=>{const o=((e,t)=>{for(let o=0;oNumber(t.replace(o,"$"+e));return et(n(1),n(2))})(e,o)},unknown:Ze},ot=(e,t)=>{const o=String(t).toLowerCase();return L(e,e=>e.search(o))},nt=/.*?version\/\ ?([0-9]+)\.([0-9]+).*/,rt=e=>t=>he(t,e),st=[{name:"Edge",versionRegexes:[/.*?edge\/ ?([0-9]+)\.([0-9]+)$/],search:e=>he(e,"edge/")&&he(e,"chrome")&&he(e,"safari")&&he(e,"applewebkit")},{name:"Chromium",brand:"Chromium",versionRegexes:[/.*?chrome\/([0-9]+)\.([0-9]+).*/,nt],search:e=>he(e,"chrome")&&!he(e,"chromeframe")},{name:"IE",versionRegexes:[/.*?msie\ ?([0-9]+)\.([0-9]+).*/,/.*?rv:([0-9]+)\.([0-9]+).*/],search:e=>he(e,"msie")||he(e,"trident")},{name:"Opera",versionRegexes:[nt,/.*?opera\/([0-9]+)\.([0-9]+).*/],search:rt("opera")},{name:"Firefox",versionRegexes:[/.*?firefox\/\ ?([0-9]+)\.([0-9]+).*/],search:rt("firefox")},{name:"Safari",versionRegexes:[nt,/.*?cpu os ([0-9]+)_([0-9]+).*/],search:e=>(he(e,"safari")||he(e,"mobile/"))&&he(e,"applewebkit")}],lt=[{name:"Windows",search:rt("win"),versionRegexes:[/.*?windows\ nt\ ?([0-9]+)\.([0-9]+).*/]},{name:"iOS",search:e=>he(e,"iphone")||he(e,"ipad"),versionRegexes:[/.*?version\/\ ?([0-9]+)\.([0-9]+).*/,/.*cpu os ([0-9]+)_([0-9]+).*/,/.*cpu iphone os ([0-9]+)_([0-9]+).*/]},{name:"Android",search:rt("android"),versionRegexes:[/.*?android\ ?([0-9]+)\.([0-9]+).*/]},{name:"macOS",search:rt("mac os x"),versionRegexes:[/.*?mac\ os\ x\ ?([0-9]+)_([0-9]+).*/]},{name:"Linux",search:rt("linux"),versionRegexes:[]},{name:"Solaris",search:rt("sunos"),versionRegexes:[]},{name:"FreeBSD",search:rt("freebsd"),versionRegexes:[]},{name:"ChromeOS",search:rt("cros"),versionRegexes:[/.*?chrome\/([0-9]+)\.([0-9]+).*/]}],at={browsers:g(st),oses:g(lt)},ct="Edge",it="Chromium",mt="Opera",dt="Firefox",ut="Safari",ft=e=>{const t=e.current,o=e.version,n=e=>()=>t===e;return{current:t,version:o,isEdge:n(ct),isChromium:n(it),isIE:n("IE"),isOpera:n(mt),isFirefox:n(dt),isSafari:n(ut)}},gt=()=>ft({current:void 0,version:tt.unknown()}),ht=ft,pt=(g(ct),g(it),g("IE"),g(mt),g(dt),g(ut),"Windows"),bt="Android",wt="Linux",vt="macOS",yt="Solaris",xt="FreeBSD",Ct="ChromeOS",Tt=e=>{const t=e.current,o=e.version,n=e=>()=>t===e;return{current:t,version:o,isWindows:n(pt),isiOS:n("iOS"),isAndroid:n(bt),isMacOS:n(vt),isLinux:n(wt),isSolaris:n(yt),isFreeBSD:n(xt),isChromeOS:n(Ct)}},St=()=>Tt({current:void 0,version:tt.unknown()}),Rt=Tt,Dt=(g(pt),g("iOS"),g(bt),g(wt),g(vt),g(yt),g(xt),g(Ct),e=>window.matchMedia(e).matches);let Ot=ye(()=>((e,t,o)=>{const n=at.browsers(),r=at.oses(),s=t.bind(e=>((e,t)=>V(t.brands,t=>{const o=t.brand.toLowerCase();return L(e,e=>o===e.brand?.toLowerCase()).map(e=>({current:e.name,version:tt.nu(parseInt(t.version,10),0)}))}))(n,e)).orThunk(()=>((e,t)=>ot(e,t).map(e=>{const o=tt.detect(e.versionRegexes,t);return{current:e.name,version:o}}))(n,e)).fold(gt,ht),l=((e,t)=>ot(e,t).map(e=>{const o=tt.detect(e.versionRegexes,t);return{current:e.name,version:o}}))(r,e).fold(St,Rt),a=((e,t,o,n)=>{const r=e.isiOS()&&!0===/ipad/i.test(o),s=e.isiOS()&&!r,l=e.isiOS()||e.isAndroid(),a=l||n("(pointer:coarse)"),c=r||!s&&l&&n("(min-device-width:768px)"),i=s||l&&!c,m=t.isSafari()&&e.isiOS()&&!1===/safari/i.test(o),d=!i&&!c&&!m;return{isiPad:g(r),isiPhone:g(s),isTablet:g(c),isPhone:g(i),isTouch:g(a),isAndroid:e.isAndroid,isiOS:e.isiOS,isWebView:g(m),isDesktop:g(d)}})(l,s,e,o);return{browser:s,os:l,deviceType:a}})(window.navigator.userAgent,C.from(window.navigator.userAgentData),Dt));const kt=()=>Ot(),Et=Object.getPrototypeOf,_t=e=>{const t=ue("ownerDocument.defaultView",e);return s(e)&&((e=>((e,t)=>{const o=((e,t)=>ue(e,t))(e,t);if(null==o)throw new Error(e+" not available on this browser");return o})("HTMLElement",e))(t).prototype.isPrototypeOf(e)||/^HTML\w*Element$/.test(Et(e).constructor.name))},Nt=e=>e.dom.nodeName.toLowerCase(),Bt=e=>e.dom.nodeType,zt=e=>t=>Bt(t)===e,At=e=>8===Bt(e)||"#comment"===Nt(e),Lt=e=>Mt(e)&&_t(e.dom),Mt=zt(1),Wt=zt(3),jt=zt(9),Pt=zt(11),It=e=>t=>Mt(t)&&Nt(t)===e,Ft=e=>Me.fromDom(e.dom.ownerDocument),Ht=e=>jt(e)?e:Ft(e),$t=e=>C.from(e.dom.parentNode).map(Me.fromDom),Vt=e=>C.from(e.dom.parentElement).map(Me.fromDom),qt=(e,t)=>{const o=d(t)?t:y;let n=e.dom;const r=[];for(;null!==n.parentNode&&void 0!==n.parentNode;){const e=n.parentNode,t=Me.fromDom(e);if(r.push(t),!0===o(t))break;n=e}return r},Ut=e=>C.from(e.dom.previousSibling).map(Me.fromDom),Gt=e=>C.from(e.dom.nextSibling).map(Me.fromDom),Kt=e=>E(e.dom.childNodes,Me.fromDom),Yt=(e,t)=>{const o=e.dom.childNodes;return C.from(o[t]).map(Me.fromDom)},Jt=e=>Pt(e)&&m(e.dom.host),Qt=e=>Me.fromDom(e.dom.getRootNode()),Xt=e=>Me.fromDom(e.dom.host),Zt=e=>{const t=Me.fromDom((e=>{if(m(e.target)){const t=Me.fromDom(e.target);if(Mt(t)&&m(t.dom.shadowRoot)&&e.composed&&e.composedPath){const t=e.composedPath();if(t)return H(t)}}return C.from(e.target)})(e).getOr(e.target)),o=()=>e.stopPropagation(),n=()=>e.preventDefault(),r=(s=n,l=o,(...e)=>s(l.apply(null,e)));var s,l;return((e,t,o,n,r,s,l)=>({target:e,x:t,y:o,stop:n,prevent:r,kill:s,raw:l}))(t,e.clientX,e.clientY,o,n,r,e)},eo=(e,t,o,n)=>{e.dom.removeEventListener(t,o,n)},to=x,oo=(e,t,o)=>((e,t,o,n)=>((e,t,o,n,r)=>{const s=((e,t)=>o=>{e(o)&&t(Zt(o))})(o,n);return e.dom.addEventListener(t,s,r),{unbind:b(eo,e,t,s,r)}})(e,t,o,n,!1))(e,t,to,o),no=Zt,ro=(e,t)=>{$t(e).each(o=>{o.dom.insertBefore(t.dom,e.dom)})},so=(e,t)=>{Gt(e).fold(()=>{$t(e).each(e=>{ao(e,t)})},e=>{ro(e,t)})},lo=(e,t)=>{const o=(e=>Yt(e,0))(e);o.fold(()=>{ao(e,t)},o=>{e.dom.insertBefore(t.dom,o.dom)})},ao=(e,t)=>{e.dom.appendChild(t.dom)},co=(e,t)=>{ro(e,t),ao(t,e)},io=(e,t)=>{_(t,(o,n)=>{const r=0===n?e:t[n-1];so(r,o)})},mo=(e,t)=>{_(t,t=>{ao(e,t)})},uo=(e,t,o)=>{if(!(r(o)||c(o)||u(o)))throw console.error("Invalid call to Attribute.set. Key ",t,":: Value ",o,":: Element ",e),new Error("Attribute value was not simple");e.setAttribute(t,o+"")},fo=(e,t,o)=>{uo(e.dom,t,o)},go=(e,t)=>{const o=e.dom;G(t,(e,t)=>{uo(o,t,e)})},ho=(e,t)=>{const o=e.dom.getAttribute(t);return null===o?void 0:o},po=(e,t)=>C.from(ho(e,t)),bo=(e,t)=>{e.dom.removeAttribute(t)},wo=e=>A(e.dom.attributes,(e,t)=>(e[t.name]=t.value,e),{}),vo=e=>{e.dom.textContent="",_(Kt(e),e=>{yo(e)})},yo=e=>{const t=e.dom;null!==t.parentNode&&t.parentNode.removeChild(t)},xo=e=>{const t=Kt(e);t.length>0&&io(e,t),yo(e)},Co=(e,t)=>Me.fromDom(e.dom.cloneNode(t)),To=e=>Co(e,!1),So=e=>Co(e,!0),Ro=(e,t)=>{const o=Me.fromTag(t),n=wo(e);return go(o,n),o},Do=e=>void 0!==e.style&&d(e.style.getPropertyValue),Oo=e=>{const t=Wt(e)?e.dom.parentNode:e.dom;if(null==t||null===t.ownerDocument)return!1;const o=t.ownerDocument;return(e=>{const t=Qt(e);return Jt(t)?C.some(t):C.none()})(Me.fromDom(t)).fold(()=>o.body.contains(t),(n=Oo,r=Xt,e=>n(r(e))));var n,r},ko=(e,t,o)=>{if(!r(o))throw console.error("Invalid call to CSS.set. Property ",t,":: Value ",o,":: Element ",e),new Error("CSS value must be a string: "+o);Do(e)&&e.style.setProperty(t,o)},Eo=(e,t,o)=>{const n=e.dom;ko(n,t,o)},_o=(e,t)=>{const o=e.dom;G(t,(e,t)=>{ko(o,t,e)})},No=(e,t)=>{const o=e.dom,n=window.getComputedStyle(o).getPropertyValue(t);return""!==n||Oo(e)?n:Bo(o,t)},Bo=(e,t)=>Do(e)?e.style.getPropertyValue(t):"",zo=(e,t)=>{const o=e.dom,n=Bo(o,t);return C.from(n).filter(e=>e.length>0)},Ao=(e,t)=>{((e,t)=>{Do(e)&&e.style.removeProperty(t)})(e.dom,t),ie(po(e,"style").map(we),"")&&bo(e,"style")},Lo=(e,t)=>{const o=o=>{const n=t(o);if(n<=0||null===n){const t=No(o,e);return parseFloat(t)||0}return n},n=(e,t)=>A(t,(t,o)=>{const n=No(e,o),r=void 0===n?0:parseInt(n,10);return isNaN(r)?t:t+r},0);return{set:(t,o)=>{if(!u(o)&&!o.match(/^[0-9]+$/))throw new Error(e+".set accepts only positive integer values. Value was "+o);const n=t.dom;Do(n)&&(n.style[e]=o+"px")},get:o,getOuter:o,aggregate:n,max:(e,t,o)=>{const r=n(e,o);return t>r?t-r:0}}},Mo=(e,t,o)=>((e,t)=>(e=>{const t=parseFloat(e);return isNaN(t)?C.none():C.some(t)})(e).getOr(t))(No(e,t),o),Wo=Lo("height",e=>{const t=e.dom;return Oo(e)?t.getBoundingClientRect().height:t.offsetHeight}),jo=e=>Wo.get(e),Po=e=>Wo.getOuter(e),Io=Lo("width",e=>{const t=e.dom;return Oo(e)?t.getBoundingClientRect().width:t.offsetWidth}),Fo=e=>Io.get(e),Ho=e=>Io.getOuter(e),$o=e=>((e,t)=>{const o=e.dom,n=o.getBoundingClientRect().width||o.offsetWidth;return"border-box"===t?n:((e,t,o,n)=>t-Mo(e,`padding-${o}`,0)-Mo(e,`padding-${n}`,0)-Mo(e,`border-${o}-width`,0)-Mo(e,`border-${n}-width`,0))(e,n,"left","right")})(e,"content-box"),Vo=(e,t)=>({left:e,top:t,translate:(o,n)=>Vo(e+o,t+n)}),qo=Vo,Uo=(e,t)=>void 0!==e?e:void 0!==t?t:0,Go=e=>{const t=e.dom.ownerDocument,o=t.body,n=t.defaultView,r=t.documentElement;if(o===e.dom)return qo(o.offsetLeft,o.offsetTop);const s=Uo(n?.pageYOffset,r.scrollTop),l=Uo(n?.pageXOffset,r.scrollLeft),a=Uo(r.clientTop,o.clientTop),c=Uo(r.clientLeft,o.clientLeft);return Ko(e).translate(l-c,s-a)},Ko=e=>{const t=e.dom,o=t.ownerDocument.body;return o===t?qo(o.offsetLeft,o.offsetTop):Oo(e)?(e=>{const t=e.getBoundingClientRect();return qo(t.left,t.top)})(t):qo(0,0)},Yo=(e=>{const t=t=>e(t)?C.from(t.dom.nodeValue):C.none();return{get:o=>{if(!e(o))throw new Error("Can only get text value of a text node");return t(o).getOr("")},getOption:t,set:(t,o)=>{if(!e(t))throw new Error("Can only set raw text value of a text node");t.dom.nodeValue=o}}})(Wt),Jo=e=>Yo.get(e),Qo=e=>Yo.getOption(e),Xo=(e,t)=>Yo.set(e,t),Zo=(e,t)=>o=>"rtl"===en(o)?t:e,en=e=>"rtl"===No(e,"direction")?"rtl":"ltr";var tn=(e,t,o,n,r)=>e(o,n)?C.some(o):d(r)&&r(o)?C.none():t(o,n,r);const on=(e,t,o)=>{let n=e.dom;const r=d(o)?o:y;for(;n.parentNode;){n=n.parentNode;const e=Me.fromDom(n);if(t(e))return C.some(e);if(r(e))break}return C.none()},nn=(e,t,o)=>tn((e,t)=>t(e),on,e,t,o),rn=(e,t,o)=>on(e,e=>Ge(e,t),o),sn=(e,t)=>(e=>L(e.dom.childNodes,e=>{return o=Me.fromDom(e),Ge(o,t);var o}).map(Me.fromDom))(e),ln=(e,t)=>Ye(t,e),an=(e,t,o)=>tn((e,t)=>Ge(e,t),rn,e,t,o),cn=e=>void 0!==e.dom.classList,mn=(e,t)=>((e,t,o)=>{const n=((e,t)=>{const o=ho(e,t);return void 0===o||""===o?[]:o.split(" ")})(e,t).concat([o]);return fo(e,t,n.join(" ")),!0})(e,"class",t),dn=(e,t)=>{cn(e)?e.dom.classList.add(t):mn(e,t)},un=(e,t)=>cn(e)&&e.dom.classList.contains(t),fn=e=>an(e,"[contenteditable]"),gn=(e,t=!1)=>Oo(e)?e.dom.isContentEditable:fn(e).fold(g(t),e=>"true"===hn(e)),hn=e=>e.dom.contentEditable,pn=(e,t)=>{let o=[];return _(Kt(e),e=>{t(e)&&(o=o.concat([e])),o=o.concat(pn(e,t))}),o},bn=(e,t,o)=>((e,o,n)=>B(qt(e,n),e=>Ge(e,t)))(e,0,o),wn=(e,t)=>(e=>B(Kt(e),e=>Ge(e,t)))(e),vn=(e,t)=>((e,t)=>{const o=void 0===t?document:t.dom;return Ke(o)?[]:E(o.querySelectorAll(e),Me.fromDom)})(t,e),yn=e=>"img"===Nt(e)?1:Qo(e).fold(()=>Kt(e).length,e=>e.length),xn=["img","br"],Cn=e=>Qo(e).filter(e=>0!==e.trim().length||e.indexOf("\xa0")>-1).isSome()||D(xn,Nt(e))||(e=>Lt(e)&&"false"===ho(e,"contenteditable"))(e),Tn=e=>((e,t)=>{const o=e=>{for(let n=0;nRn(e,Cn),Rn=(e,t)=>{const o=e=>{const n=Kt(e);for(let e=n.length-1;e>=0;e--){const r=n[e];if(t(r))return C.some(r);const s=o(r);if(s.isSome())return s}return C.none()};return o(e)},Dn=(e,t,o,n)=>({start:e,soffset:t,finish:o,foffset:n}),On=Z([{before:["element"]},{on:["element","offset"]},{after:["element"]}]),kn={before:On.before,on:On.on,after:On.after,cata:(e,t,o,n)=>e.fold(t,o,n),getStart:e=>e.fold(h,h,h)},En=Z([{domRange:["rng"]},{relative:["startSitu","finishSitu"]},{exact:["start","soffset","finish","foffset"]}]),_n={domRange:En.domRange,relative:En.relative,exact:En.exact,exactFromRange:e=>En.exact(e.start,e.soffset,e.finish,e.foffset),getWin:e=>{const t=(e=>e.match({domRange:e=>Me.fromDom(e.startContainer),relative:(e,t)=>kn.getStart(e),exact:(e,t,o,n)=>e}))(e);return Me.fromDom(Ht(t).dom.defaultView)},range:Dn},Nn=(e,t)=>{const o=Nt(e);return"input"===o?kn.after(e):D(["br","img"],o)?0===t?kn.before(e):kn.after(e):kn.on(e,t)},Bn=e=>C.from(e.getSelection()),zn=(e,t)=>{Bn(e).each(e=>{e.removeAllRanges(),e.addRange(t)})},An=(e,t,o,n,r)=>{const s=Fe(e,t,o,n,r);zn(e,s)},Ln=(e,t)=>qe(e,t).match({ltr:(t,o,n,r)=>{An(e,t,o,n,r)},rtl:(t,o,n,r)=>{Bn(e).each(s=>{if(s.setBaseAndExtent)s.setBaseAndExtent(t.dom,o,n.dom,r);else if(s.extend)try{((e,t,o,n,r,s)=>{t.collapse(o.dom,n),t.extend(r.dom,s)})(0,s,t,o,n,r)}catch{An(e,n,r,t,o)}else An(e,n,r,t,o)})}}),Mn=(e,t,o,n,r)=>{const s=((e,t,o,n)=>{const r=Nn(e,t),s=Nn(o,n);return _n.relative(r,s)})(t,o,n,r);Ln(e,s)},Wn=(e,t,o)=>{const n=((e,t)=>{const o=e.fold(kn.before,Nn,kn.after),n=t.fold(kn.before,Nn,kn.after);return _n.relative(o,n)})(t,o);Ln(e,n)},jn=e=>{if(e.rangeCount>0){const t=e.getRangeAt(0),o=e.getRangeAt(e.rangeCount-1);return C.some(Dn(Me.fromDom(t.startContainer),t.startOffset,Me.fromDom(o.endContainer),o.endOffset))}return C.none()},Pn=e=>{if(null===e.anchorNode||null===e.focusNode)return jn(e);{const t=Me.fromDom(e.anchorNode),o=Me.fromDom(e.focusNode);return((e,t,o,n)=>{const r=((e,t,o,n)=>{const r=Ft(e).dom.createRange();return r.setStart(e.dom,t),r.setEnd(o.dom,n),r})(e,t,o,n),s=Je(e,o)&&t===n;return r.collapsed&&!s})(t,e.anchorOffset,o,e.focusOffset)?C.some(Dn(t,e.anchorOffset,o,e.focusOffset)):jn(e)}},In=(e,t,o=!0)=>{const n=(o?je:We)(e,t);zn(e,n)},Fn=e=>(e=>Bn(e).filter(e=>e.rangeCount>0).bind(Pn))(e).map(e=>_n.exact(e.start,e.soffset,e.finish,e.foffset)),Hn=(e,t,o)=>((e,t,o)=>((e,t,o)=>e.caretPositionFromPoint?((e,t,o)=>C.from(e.caretPositionFromPoint?.(t,o)).bind(t=>{if(null===t.offsetNode)return C.none();const o=e.createRange();return o.setStart(t.offsetNode,t.offset),o.collapse(),C.some(o)}))(e,t,o):e.caretRangeFromPoint?((e,t,o)=>C.from(e.caretRangeFromPoint?.(t,o)))(e,t,o):C.none())(e.document,t,o).map(e=>Dn(Me.fromDom(e.startContainer),e.startOffset,Me.fromDom(e.endContainer),e.endOffset)))(e,t,o),$n={unsupportedLength:["em","ex","cap","ch","ic","rem","lh","rlh","vw","vh","vi","vb","vmin","vmax","cm","mm","Q","in","pc","pt","px"],fixed:["px","pt"],relative:["%"],empty:[""]},Vn=(()=>{const e="[0-9]+",t="[eE][+-]?"+e,o=e=>`(?:${e})?`,n=["Infinity",e+"\\."+o(e)+o(t),"\\."+e+o(t),e+o(t)].join("|");return new RegExp(`^([+-]?(?:${n}))(.*)$`)})(),qn=e=>E(e,g(0)),Un=(e,t,o,n,r)=>r(e.slice(0,t)).concat(n).concat(r(e.slice(o))),Gn=e=>(t,o,n,r)=>{if(e(n)){const e=Math.max(r,t[o]-Math.abs(n)),s=Math.abs(e-t[o]);return n>=0?s:-s}return n},Kn=Gn(e=>e<0),Yn=Gn(x),Jn=()=>{const e=(e,t,o,n)=>{const r=(100+o)/100,s=Math.max(n,(e[t]+o)/r);return E(e,(e,o)=>(o===t?s:e/r)-e)},t=(t,o,n,r,s,l)=>l?e(t,o,r,s):((e,t,o,n,r)=>{const s=Kn(e,t,n,r);return Un(e,t,o+1,[s,0],qn)})(t,o,n,r,s);return{resizeTable:(e,t)=>e(t),clampTableDelta:Kn,calcLeftEdgeDeltas:t,calcMiddleDeltas:(e,o,n,r,s,l,a)=>t(e,n,r,s,l,a),calcRightEdgeDeltas:(t,o,n,r,s,l)=>{if(l)return e(t,n,r,s);{const e=Kn(t,n,r,s);return qn(t.slice(0,n)).concat([e])}},calcRedestributedWidths:(e,t,o,n)=>{if(n){const n=(t+o)/t,r=E(e,e=>e/n);return{delta:100*n-100,newSizes:r}}return{delta:o,newSizes:e}}}},Qn=()=>{const e=(e,t,o,n,r)=>{const s=Yn(e,n>=0?o:t,n,r);return Un(e,t,o+1,[s,-s],qn)};return{resizeTable:(e,t,o)=>{o&&e(t)},clampTableDelta:(e,t,o,n,r)=>{if(r){if(o>=0)return o;{const t=A(e,(e,t)=>e+t-n,0);return Math.max(-t,o)}}return Kn(e,t,o,n)},calcLeftEdgeDeltas:e,calcMiddleDeltas:(t,o,n,r,s,l)=>e(t,n,r,s,l),calcRightEdgeDeltas:(e,t,o,n,r,s)=>{if(s)return qn(e);{const t=n/e.length;return E(e,g(t))}},calcRedestributedWidths:(e,t,o,n)=>({delta:0,newSizes:e})}},Xn=(e,t,o=0)=>po(e,t).map(e=>parseInt(e,10)).getOr(o),Zn=(e,t)=>Xn(e,t,1),er=e=>It("col")(e)?Xn(e,"span",1)>1:Zn(e,"colspan")>1,tr=(e,t)=>parseInt(No(e,t),10),or=g(10),nr=g(10),rr=(e,t)=>sr(e,t,x),sr=(e,t,o)=>j(Kt(e),e=>Ge(e,t)?o(e)?[e]:[]:sr(e,t,o)),lr=(e,t)=>((e,t,o=y)=>o(t)?C.none():D(e,Nt(t))?C.some(t):rn(t,e.join(","),e=>Ge(e,"table")||o(e)))(["td","th"],e,t),ar=e=>rr(e,"th,td"),cr=e=>Ge(e,"colgroup")?wn(e,"col"):j(dr(e),e=>wn(e,"col")),ir=(e,t)=>an(e,"table",t),mr=e=>rr(e,"tr"),dr=e=>ir(e).fold(g([]),e=>wn(e,"colgroup")),ur=It("th"),fr=e=>P(e,e=>ur(e.element)),gr=(e,t)=>e&&t?"sectionCells":e?"section":"cells",hr=e=>{const t="thead"===e.section,o=ie(pr(e.cells),"th");return"tfoot"===e.section?{type:"footer"}:t||o?{type:"header",subType:gr(t,o)}:{type:"body"}},pr=e=>{const t=B(e,e=>ur(e.element));return 0===t.length?C.some("td"):t.length===e.length?C.some("th"):C.none()},br=(e,t)=>E(e,e=>{if("colgroup"===Nt(e)){const t=E(cr(e),e=>{const t=Xn(e,"span",1);return Ce(e,1,t)});return Te(e,t,"colgroup")}{const o=E(ar(e),e=>{const t=Xn(e,"rowspan",1),o=Xn(e,"colspan",1);return Ce(e,t,o)});return Te(e,o,t(e))}}),wr=e=>$t(e).map(e=>{const t=Nt(e);return(e=>D(xe,e))(t)?t:"tbody"}).getOr("tbody"),vr=e=>{const t=mr(e),o=[...dr(e),...t];return br(o,wr)},yr="data-snooker-locked-cols",xr=e=>po(e,yr).bind(e=>C.from(e.match(/\d+/g))).map(e=>I(e,x)),Cr=e=>{const t=A(ze(e).rows,(e,t)=>(_(t.cells,(t,o)=>{t.isLocked&&(e[o]=!0)}),e),{}),o=J(t,(e,t)=>parseInt(t,10));return(e=>{const t=T.call(e,0);return t.sort(void 0),t})(o)},Tr=(e,t)=>e+","+t,Sr=(e,t)=>{const o=j(e.all,e=>e.cells);return B(o,t)},Rr=e=>{const t={},o=[],n=H(e).map(e=>e.element).bind(ir).bind(xr).getOr({});let r=0,s=0,l=0;const{pass:a,fail:c}=N(e,e=>"colgroup"===e.section);_(c,e=>{const a=[];_(e.cells,e=>{let o=0;for(;void 0!==t[Tr(l,o)];)o++;const r=((e,t)=>X(e,t)&&void 0!==e[t]&&null!==e[t])(n,o.toString()),c=((e,t,o,n,r,s)=>({element:e,rowspan:t,colspan:o,row:n,column:r,isLocked:s}))(e.element,e.rowspan,e.colspan,l,o,r);for(let n=0;n{const t=(e=>{const t={};let o=0;return _(e.cells,e=>{const n=e.colspan;k(n,r=>{const s=o+r;t[s]=((e,t,o)=>({element:e,colspan:t,column:o}))(e.element,n,s)}),o+=n}),t})(e),o=((e,t)=>({element:e,columns:t}))(e.element,Q(t));return{colgroups:[o],columns:t}}).getOrThunk(()=>({colgroups:[],columns:{}})),d=((e,t)=>({rows:e,columns:t}))(r,s);return{grid:d,access:t,all:o,columns:i,colgroups:m}},Dr=e=>{const t=vr(e);return Rr(t)},Or=Rr,kr=(e,t,o)=>C.from(e.access[Tr(t,o)]),Er=(e,t,o)=>{const n=Sr(e,e=>o(t,e.element));return n.length>0?C.some(n[0]):C.none()},_r=Sr,Nr=e=>j(e.all,e=>e.cells),Br=e=>Q(e.columns),zr=e=>q(e.columns).length>0,Ar=(e,t)=>C.from(e.columns[t]),Lr=(e,t,o)=>Se(o(e.element,t),!0,e.isLocked),Mr=(e,t)=>e.section!==t?Re(e.element,e.cells,t,e.isNew):e,Wr=()=>({transformRow:Mr,transformCell:(e,t,o)=>{const n=o(e.element,t),r="td"!==Nt(n)?(e=>{const t=Ro(e,"td");so(e,t);const o=Kt(e);return mo(t,o),yo(e),t})(n):n;return Se(r,e.isNew,e.isLocked)}}),jr=()=>({transformRow:Mr,transformCell:Lr}),Pr=()=>({transformRow:(e,t)=>Mr(e,"thead"===t?"tbody":t),transformCell:Lr}),Ir=Wr,Fr=jr,Hr=Pr,$r=()=>({transformRow:h,transformCell:Lr}),Vr=(e,t=x)=>{const o=e.grid,n=k(o.columns,h),r=k(o.rows,h);return E(n,o=>qr(()=>j(r,t=>kr(e,t,o).filter(e=>e.column===o).toArray()),e=>1===e.colspan&&t(e.element),()=>kr(e,0,o)))},qr=(e,t,o)=>{const n=e();return L(n,t).orThunk(()=>C.from(n[0]).orThunk(o)).map(e=>e.element)},Ur=e=>{const t=e.grid,o=k(t.rows,h),n=k(t.columns,h);return E(o,t=>qr(()=>j(n,o=>kr(e,t,o).filter(e=>e.row===t).fold(g([]),e=>[e])),e=>1===e.rowspan,()=>kr(e,t,0)))},Gr=(e,t)=>({row:e,y:t}),Kr=(e,t)=>({col:e,x:t}),Yr=e=>Go(e).left+Ho(e),Jr=e=>Go(e).left,Qr=(e,t)=>Kr(e,Jr(t)),Xr=(e,t)=>Kr(e,Yr(t)),Zr=e=>Go(e).top,es=(e,t)=>Gr(e,Zr(t)),ts=(e,t)=>Gr(e,Zr(t)+Po(t)),os=(e,t,o)=>{if(0===o.length)return[];const n=E(o.slice(1),(t,o)=>t.map(t=>e(o,t))),r=o[o.length-1].map(e=>t(o.length-1,e));return n.concat([r])},ns={delta:h,positions:e=>os(es,ts,e),edge:Zr},rs=Zo({delta:h,edge:Jr,positions:e=>os(Qr,Xr,e)},{delta:e=>-e,edge:Yr,positions:e=>os(Xr,Qr,e)}),ss={delta:(e,t)=>rs(t).delta(e,t),positions:(e,t)=>rs(t).positions(e,t),edge:e=>rs(e).edge(e)},ls=/(\d+(\.\d+)?)%/,as=/(\d+(\.\d+)?)px|em/,cs=It("col"),is=It("tr"),ms=(e,t,o)=>{const n=Vt(e).getOrThunk(()=>(e=>{const t=e.dom.body;if(null==t)throw new Error("Body is not available yet");return Me.fromDom(t)})(Ft(e)));return t(e)/o(n)*100},ds=(e,t)=>{Eo(e,"width",t+"px")},us=(e,t)=>{Eo(e,"width",t+"%")},fs=(e,t)=>{Eo(e,"height",t+"px")},gs=e=>{const t=(e=>{return Mo(t=e,"height",t.dom.offsetHeight)+"px";var t})(e);return t?((e,t,o,n)=>{const r=parseFloat(e);return be(e,"%")&&"table"!==Nt(t)?((e,t,o,n)=>{const r=ir(e).map(e=>{const n=o(e);return Math.floor(t/100*n)}).getOr(t);return n(e,r),r})(t,r,o,n):r})(t,e,jo,fs):jo(e)},hs=(e,t)=>zo(e,t).orThunk(()=>po(e,t).map(e=>e+"px")),ps=e=>hs(e,"width"),bs=e=>ms(e,Fo,$o),ws=e=>{return cs(e)?Math.round(Fo(e)):Mo(t=e,"width",t.dom.offsetWidth);var t},vs=e=>is(e)?jo(e):((e,t,o)=>o(e)/Zn(e,"rowspan"))(e,0,gs),ys=(e,t,o)=>{Eo(e,"width",t+o)},xs=e=>ms(e,Fo,$o)+"%",Cs=g(ls),Ts=It("col"),Ss=e=>ps(e).getOrThunk(()=>ws(e)+"px"),Rs=e=>{return(t=e,hs(t,"height")).getOrThunk(()=>vs(e)+"px");var t},Ds=(e,t,o,n,r,s)=>e.filter(n).fold(()=>s(((e,t)=>{if(t<0||t>=e.length-1)return C.none();const o=e[t].fold(()=>{const o=(e=>{const t=T.call(e,0);return t.reverse(),t})(e.slice(0,t));return V(o,(e,t)=>e.map(e=>({value:e,delta:t+1})))},e=>C.some({value:e,delta:0})),n=e[t+1].fold(()=>{const o=e.slice(t+1);return V(o,(e,t)=>e.map(e=>({value:e,delta:t+1})))},e=>C.some({value:e,delta:1}));return o.bind(e=>n.map(t=>{const o=t.delta+e.delta;return Math.abs(t.value-e.value)/o}))})(o,t)),e=>r(e)),Os=(e,t,o,n)=>{const r=Vr(e),s=zr(e)?(e=>E(Br(e),e=>C.from(e.element)))(e):r,l=[C.some(ss.edge(t))].concat(E(ss.positions(r,t),e=>e.map(e=>e.x))),a=w(er);return E(s,(e,t)=>Ds(e,t,l,a,e=>{if((e=>{const t=kt().browser,o=t.isChromium()||t.isFirefox();return!Ts(e)||o})(e))return o(e);{const e=null!=(s=r[t])?h(s):C.none();return Ds(e,t,l,a,e=>n(C.some(Math.round(Fo(e)))),n)}var s},n))},ks=e=>e.map(e=>e+"px").getOr(""),Es=(e,t,o)=>Os(e,t,ws,e=>e.getOrThunk(o.minCellWidth)),_s=(e,t,o,n)=>{const r=Ur(e),s=E(e.all,e=>C.some(e.element)),l=[C.some(ns.edge(t))].concat(E(ns.positions(r,t),e=>e.map(e=>e.y)));return E(s,(e,t)=>Ds(e,t,l,x,o,n))},Ns=(e,t)=>()=>Oo(e)?t(e):parseFloat(zo(e,"width").getOr("0")),Bs=e=>{const t=Ns(e,e=>parseFloat(xs(e))),o=Ns(e,Fo);return{width:t,pixelWidth:o,getWidths:(t,o)=>((e,t,o)=>Os(e,t,bs,e=>e.fold(()=>o.minCellWidth(),e=>e/o.pixelWidth()*100)))(t,e,o),getCellDelta:e=>e/o()*100,singleColumnWidth:(e,t)=>[100-e],minCellWidth:()=>or()/o()*100,setElementWidth:us,adjustTableWidth:o=>{const n=t();us(e,n+o/100*n)},isRelative:!0,label:"percent"}},zs=e=>{const t=Ns(e,Fo);return{width:t,pixelWidth:t,getWidths:(t,o)=>Es(t,e,o),getCellDelta:h,singleColumnWidth:(e,t)=>[Math.max(or(),e+t)-e],minCellWidth:or,setElementWidth:ds,adjustTableWidth:o=>{const n=t()+o;ds(e,n)},isRelative:!1,label:"pixel"}},As=e=>ps(e).fold(()=>(e=>{const t=Ns(e,Fo),o=g(0);return{width:t,pixelWidth:t,getWidths:(t,o)=>Es(t,e,o),getCellDelta:o,singleColumnWidth:g([0]),minCellWidth:o,setElementWidth:f,adjustTableWidth:f,isRelative:!0,label:"none"}})(e),t=>((e,t)=>null!==Cs().exec(t)?Bs(e):zs(e))(e,t)),Ls=zs,Ms=Bs,Ws=(e,t,o,n)=>{o===n?bo(e,t):fo(e,t,o)},js=(e,t,o)=>{$(wn(e,t)).fold(()=>lo(e,o),e=>so(e,o))},Ps=(e,t)=>{const o=[],n=[],r=e=>E(e,e=>{e.isNew&&o.push(e.element);const t=e.element;return vo(t),_(e.cells,e=>{e.isNew&&n.push(e.element),Ws(e.element,"colspan",e.colspan,1),Ws(e.element,"rowspan",e.rowspan,1),ao(t,e.element)}),t}),s=e=>j(e,e=>E(e.cells,e=>(Ws(e.element,"span",e.colspan,1),e.element))),l=(t,o)=>{const n=((e,t)=>{const o=sn(e,t).getOrThunk(()=>{const o=Me.fromTag(t,Ft(e).dom);return"thead"===t?js(e,"caption,colgroup",o):"colgroup"===t?js(e,"caption",o):ao(e,o),o});return vo(o),o})(e,o),l=("colgroup"===o?s:r)(t);mo(n,l)},a=(t,o)=>{t.length>0?l(t,o):(t=>{sn(e,t).each(yo)})(o)},c=[],i=[],m=[],d=[];return _(t,e=>{switch(e.section){case"thead":c.push(e);break;case"tbody":i.push(e);break;case"tfoot":m.push(e);break;case"colgroup":d.push(e)}}),a(d,"colgroup"),a(c,"thead"),a(i,"tbody"),a(m,"tfoot"),{newRows:o,newCells:n}},Is=(e,t)=>{if(0===e.length)return 0;const o=e[0];return M(e,e=>!t(o.element,e.element)).getOr(e.length)},Fs=(e,t)=>{const o=E(e,e=>E(e.cells,y));return E(e,(n,r)=>{const s=j(n.cells,(n,s)=>{if(!1===o[r][s]){const m=((e,t,o,n)=>{const r=((e,t)=>e[t])(e,t),s="colgroup"===r.section,l=Is(r.cells.slice(o),n),a=s?1:Is(((e,t)=>E(e,e=>_e(e,t)))(e.slice(t),o),n);return{colspan:l,rowspan:a}})(e,r,s,t);return((e,t,n,r)=>{for(let s=e;s({element:e,cells:t,section:o,isNew:n}))(n.element,s,n.section,n.isNew)})},Hs=(e,t,o)=>{const n=[];_(e.colgroups,r=>{const s=[];for(let n=0;nSe(e.element,o,!1)).getOrThunk(()=>Se(t.colGap(),!0,!1));s.push(r)}n.push(Re(r.element,s,"colgroup",o))});for(let r=0;rSe(e.element,o,e.isLocked)).getOrThunk(()=>Se(t.gap(),!0,!1));s.push(l)}const l=e.all[r],a=Re(l.element,s,l.section,o);n.push(a)}return n},$s=e=>Fs(e,Je),Vs=(e,t)=>V(e.all,e=>L(e.cells,e=>Je(t,e.element))),qs=(e,t,o)=>{const n=E(t.selection,t=>lr(t).bind(t=>Vs(e,t)).filter(o)),r=me(n);return de(r.length>0,r)},Us=(e,t,o,n,r,s,l,a,c)=>{const i=Dr(s),m=C.from(c?.section).getOrThunk($r);return t(i,l).map(t=>{const o=((e,t)=>Hs(e,t,!1))(i,a),n=e(o,t,Je,r(a),m),s=Cr(n.grid);return{info:t,grid:$s(n.grid),cursor:n.cursor,lockedColumns:s}}).bind(e=>{const t=Ps(s,e.grid),r=C.from(c?.sizing).getOrThunk(()=>As(s)),l=C.from(c?.resize).getOrThunk(Qn);return o(s,e.grid,e.info,{sizing:r,resize:l,section:m}),n(s),bo(s,yr),e.lockedColumns.length>0&&fo(s,yr,e.lockedColumns.join(",")),C.some({cursor:e.cursor,newRows:t.newRows,newCells:t.newCells})})},Gs=(e,t)=>lr(t.element).bind(o=>Vs(e,o).map(e=>({...e,generators:t.generators,clipboard:t.clipboard}))),Ks=(e,t)=>qs(e,t,x).map(e=>({cells:e,generators:t.generators,clipboard:t.clipboard})),Ys=(e,t)=>qs(e,t,x),Js=(e,t)=>qs(e,t,e=>!e.isLocked),Qs=(e,t)=>P(t,t=>((e,t)=>Vs(e,t).exists(e=>!e.isLocked))(e,t)),Xs=(e,t)=>((e,t)=>t.mergable)(0,t).filter(t=>Qs(e,t.cells)),Zs=(e,t)=>((e,t)=>t.unmergable)(0,t).filter(t=>Qs(e,t)),el={...Z([{none:[]},{only:["index"]},{left:["index","next"]},{middle:["prev","index","next"]},{right:["prev","index"]}])},tl=(e,t,o)=>{const n=((e,t)=>zr(e)?((e,t)=>{const o=Br(e);return E(o,(e,o)=>({element:e.element,width:t[o],colspan:e.colspan}))})(e,t):((e,t)=>{const o=Nr(e);return E(o,e=>{const o=((e,t,o)=>{let n=0;for(let r=e;r{o.setElementWidth(e.element,e.width)})},ol=(e,t,o,n,r)=>{const s=Dr(e),l=r.getCellDelta(t),a=r.getWidths(s,r),c=o===s.grid.columns-1,i=n.clampTableDelta(a,o,l,r.minCellWidth(),c),m=((e,t,o,n,r)=>{const s=e.slice(0),l=((e,t)=>0===e.length?el.none():1===e.length?el.only(0):0===t?el.left(0,1):t===e.length-1?el.right(t-1,t):t>0&&tn.singleColumnWidth(s[e],o),(e,t)=>r.calcLeftEdgeDeltas(s,e,t,o,n.minCellWidth(),n.isRelative),(e,t,l)=>r.calcMiddleDeltas(s,e,t,l,o,n.minCellWidth(),n.isRelative),(e,t)=>r.calcRightEdgeDeltas(s,e,t,o,n.minCellWidth(),n.isRelative))})(a,o,i,r,n),d=E(m,(e,t)=>e+a[t]);tl(s,d,r),n.resizeTable(r.adjustTableWidth,i,c)},nl=(e,t,o)=>{const n=Dr(e),r=((e,t)=>_s(e,t,vs,e=>e.getOrThunk(nr)))(n,e),s=E(r,(e,n)=>o===n?Math.max(t+e,nr()):e),l=((e,t)=>E(e.all,(e,o)=>({element:e.element,height:t[o]})))(n,s);_(l,e=>{fs(e.element,e.height)}),_(Nr(n),e=>{(e=>{Ao(e,"height")})(e.element)});const a=z(s,(e,t)=>e+t,0);fs(e,a)},rl=(e,t)=>{if(!er(e)){const o=(e=>ps(e).bind(e=>{return t=e,o=["fixed","relative","empty"],C.from(Vn.exec(t)).bind(e=>{const t=Number(e[1]),n=e[2];return((e,t)=>O(t,t=>O($n[t],t=>e===t)))(n,o)?C.some({value:t,unit:n}):C.none()});var t,o}))(e);o.each(o=>{const n=o.value/2;ys(e,n,o.unit),ys(t,n,o.unit)})}},sl=(e,t,o)=>{const n=Xn(e,t,1);1===o||n<=1?bo(e,t):fo(e,t,Math.min(o,n))},ll=(e,t)=>o=>{const n=o.column+o.colspan-1,r=o.column;return n>=e&&r{const n=e[o].element,r=Me.fromTag("td");ao(r,Me.fromTag("br")),(t?ao:lo)(n,r)},cl=It("col"),il=It("colgroup"),ml=e=>"tr"===Nt(e)||il(e),dl=e=>({element:e,colspan:Xn(e,"colspan",1),rowspan:Xn(e,"rowspan",1)}),ul=e=>po(e,"scope").map(e=>e.substr(0,3)),fl=(e,t=dl)=>{const o=o=>{if(ml(o))return il((r={element:o}).element)?e.colgroup(r):e.row(r);{const r=o,s=(t=>cl(t.element)?e.col(t):e.cell(t))(t(r));return n=C.some({item:r,replacement:s}),s}var r};let n=C.none();return{getOrInit:(e,t)=>n.fold(()=>o(e),n=>t(e,n.item)?n.replacement:o(e))}},gl=e=>t=>{const o=[],n=n=>{const r="td"===e?{scope:null}:{},s=t.replace(n,e,r);return o.push({item:n,sub:s}),s};return{replaceOrInit:(e,t)=>{if(ml(e)||cl(e))return e;{const r=e;return((e,t)=>L(o,o=>t(o.item,e)))(r,t).fold(()=>n(r),o=>t(e,o.item)?o.sub:n(r))}}}},hl=e=>({unmerge:t=>{const o=ul(t);return o.each(e=>fo(t,"scope",e)),()=>{const n=e.cell({element:t,colspan:1,rowspan:1});return Ao(n,"width"),Ao(t,"width"),o.each(e=>fo(n,"scope",e)),n}},merge:e=>(Ao(e[0],"width"),(()=>{const t=me(E(e,ul));if(0===t.length)return C.none();{const e=t[0],o=["row","col"];return O(t,t=>t!==e&&D(o,t))?C.none():C.from(e)}})().fold(()=>bo(e[0],"scope"),t=>fo(e[0],"scope",t+"group")),g(e[0]))}),pl=Z([{invalid:["raw"]},{pixels:["value"]},{percent:["value"]}]),bl=(e,t,o)=>{const n=o.substring(0,o.length-e.length),r=parseFloat(n);return n===r.toString()?t(r):pl.invalid(o)},wl={...pl,from:e=>be(e,"%")?bl("%",pl.percent,e):be(e,"px")?bl("px",pl.pixels,e):pl.invalid(e)},vl=(e,t,o)=>{const n=wl.from(o),r=P(e,e=>"0px"===e)?((e,t)=>{const o=e.fold(()=>g(""),e=>g(e/t+"px"),()=>g(100/t+"%"));return k(t,o)})(n,e.length):((e,t,o)=>e.fold(()=>t,e=>((e,t,o)=>{const n=o/t;return E(e,e=>wl.from(e).fold(()=>e,e=>e*n+"px",e=>e/100*o+"px"))})(t,o,e),e=>((e,t)=>E(e,e=>wl.from(e).fold(()=>e,e=>e/t*100+"%",e=>e+"%")))(t,o)))(n,e,t);return Cl(r)},yl=(e,t)=>0===e.length?t:z(e,(e,t)=>wl.from(t).fold(g(0),h,h)+e,0),xl=(e,t)=>wl.from(e).fold(g(e),e=>e+t+"px",e=>e+t+"%"),Cl=e=>{if(0===e.length)return e;const t=z(e,(e,t)=>{const o=wl.from(t).fold(()=>({value:t,remainder:0}),e=>(e=>{const t=Math.floor(e);return{value:t+"px",remainder:e-t}})(e),e=>({value:e+"%",remainder:0}));return{output:[o.value].concat(e.output),remainder:e.remainder+o.remainder}},{output:[],remainder:0}),o=t.output;return o.slice(0,o.length-1).concat([xl(o[o.length-1],Math.round(t.remainder))])},Tl=wl.from,Sl=(e,t,o)=>{const n=Dr(e),r=n.all,s=Nr(n),l=Br(n);t.each(t=>{const o=Tl(t).fold(g("px"),g("px"),g("%")),r=Fo(e),a=((e,t)=>Os(e,t,Ss,ks))(n,e),c=vl(a,r,t);zr(n)?((e,t,o)=>{_(t,(t,n)=>{const r=yl([e[n]],or());Eo(t.element,"width",r+o)})})(c,l,o):((e,t,o)=>{_(t,t=>{const n=e.slice(t.column,t.colspan+t.column),r=yl(n,or());Eo(t.element,"width",r+o)})})(c,s,o),Eo(e,"width",t)}),o.each(t=>{const o=jo(e),l=((e,t)=>_s(e,t,Rs,ks))(n,e);((e,t,o)=>{_(o,e=>{Ao(e.element,"height")}),_(t,(t,o)=>{Eo(t.element,"height",e[o])})})(vl(l,o,t),r,s),Eo(e,"height",t)})},Rl=e=>ps(e).exists(e=>ls.test(e)),Dl=e=>ps(e).exists(e=>as.test(e)),Ol=e=>ps(e).isNone();var kl=["body","p","div","article","aside","figcaption","figure","footer","header","nav","section","ol","ul","li","table","thead","tbody","tfoot","caption","tr","td","th","h1","h2","h3","h4","h5","h6","blockquote","pre","address"],El=()=>({up:g({selector:rn,closest:an,predicate:on,all:qt}),down:g({selector:vn,predicate:pn}),styles:g({get:No,getRaw:zo,set:Eo,remove:Ao}),attrs:g({get:ho,set:fo,remove:bo,copyTo:(e,t)=>{const o=wo(e);go(t,o)}}),insert:g({before:ro,after:so,afterAll:io,append:ao,appendAll:mo,prepend:lo,wrap:co}),remove:g({unwrap:xo,remove:yo}),create:g({nu:Me.fromTag,clone:e=>Me.fromDom(e.dom.cloneNode(!1)),text:Me.fromText}),query:g({comparePosition:(e,t)=>e.dom.compareDocumentPosition(t.dom),prevSibling:Ut,nextSibling:Gt}),property:g({children:Kt,name:Nt,parent:$t,document:e=>Ht(e).dom,isText:Wt,isComment:At,isElement:Mt,isSpecial:e=>{const t=Nt(e);return D(["script","noscript","iframe","noframes","noembed","title","style","textarea","xmp"],t)},getLanguage:e=>Mt(e)?po(e,"lang"):C.none(),getText:Jo,setText:Xo,isBoundary:e=>!!Mt(e)&&("body"===Nt(e)||D(kl,Nt(e))),isEmptyTag:e=>!!Mt(e)&&D(["br","img","hr","input"],Nt(e)),isNonEditable:e=>Mt(e)&&"false"===ho(e,"contenteditable")}),eq:Je,is:Xe});const _l=(e,t)=>({item:e,mode:t}),Nl=(e,t,o,n=Bl)=>e.property().parent(t).map(e=>_l(e,n)),Bl=(e,t,o,n=zl)=>o.sibling(e,t).map(e=>_l(e,n)),zl=(e,t,o,n=zl)=>{const r=e.property().children(t);return o.first(r).map(e=>_l(e,n))},Al=[{current:Nl,next:Bl,fallback:C.none()},{current:Bl,next:zl,fallback:C.some(Nl)},{current:zl,next:zl,fallback:C.some(Bl)}],Ll=(e,t,o,n,r=Al)=>L(r,e=>e.current===o).bind(o=>o.current(e,t,n,o.next).orThunk(()=>o.fallback.bind(o=>Ll(e,t,o,n)))),Ml=(e,t,o,n,r,s)=>Ll(e,t,n,r).bind(t=>s(t.item)?C.none():o(t.item)?C.some(t.item):Ml(e,t.item,o,t.mode,r,s)),Wl=(e,t)=>({element:e,offset:t}),jl=(e,t,o)=>e.property().isText(t)&&0===e.property().getText(t).trim().length||e.property().isComment(t)?o(t).bind(t=>jl(e,t,o).orThunk(()=>C.some(t))):C.none(),Pl=(e,t)=>e.property().isText(t)?e.property().getText(t).length:e.property().children(t).length,Il=(e,t)=>{const o=jl(e,t,e.query().prevSibling).getOr(t);if(e.property().isText(o))return Wl(o,Pl(e,o));const n=e.property().children(o);return n.length>0?Il(e,n[n.length-1]):Wl(o,Pl(e,o))},Fl=Il,Hl=El(),$l=e=>t=>0===e.property().children(t).length,Vl=(e,t,o,n)=>Ml(e,t,o,Bl,{sibling:(e,t)=>e.query().prevSibling(t),first:e=>e.length>0?C.some(e[e.length-1]):C.none()},n),ql=(e,t,o,n)=>Ml(e,t,o,Bl,{sibling:(e,t)=>e.query().nextSibling(t),first:e=>e.length>0?C.some(e[0]):C.none()},n),Ul=El(),Gl=(e,t)=>((e,t,o)=>Vl(e,t,$l(e),o))(Ul,e,t),Kl=(e,t)=>((e,t,o)=>ql(e,t,$l(e),o))(Ul,e,t),Yl=["body","p","div","article","aside","figcaption","figure","footer","header","nav","section","ol","ul","table","thead","tfoot","tbody","caption","tr","td","th","h1","h2","h3","h4","h5","h6","blockquote","pre","address"],Jl=(e,t,o,n)=>{const r=t(e,o);return z(n,(o,n)=>{const r=t(e,n);return Ql(e,o,r)},r)},Ql=(e,t,o)=>t.bind(t=>o.filter(b(e.eq,t))),Xl=El(),Zl=(e,t)=>((e,t,o)=>o.length>0?((e,t,o,n)=>n(e,t,o[0],o.slice(1)))(e,t,o,Jl):C.none())(Xl,(t,o)=>e(o),t),ea=El(),ta=e=>((e,t)=>{const o=e.property().name(t);return D(Yl,o)})(ea,e),oa=e=>((e,t)=>{const o=e.property().name(t);return D(["ol","ul"],o)})(ea,e),na=e=>{const t=It("br"),o=e=>Sn(e).bind(o=>{const n=Gt(o).map(e=>!!ta(e)||!!((e,t)=>D(["br","img","hr","input"],e.property().name(t)))(ea,e)&&"img"!==Nt(e)).getOr(!1);return $t(o).map(r=>{return!0===n||("li"===Nt(s=r)||on(s,oa).isSome())||t(o)||ta(r)&&!Je(e,r)?[]:[Me.fromTag("br")];var s})}).getOr([]),n=(()=>{const n=j(e,e=>{const n=Kt(e);return(e=>P(e,e=>t(e)||Wt(e)&&0===Jo(e).trim().length))(n)?[]:n.concat(o(e))});return 0===n.length?[Me.fromTag("br")]:n})();vo(e[0]),mo(e[0],n)},ra=e=>{bo(e,"width"),bo(e,"height")},sa=e=>{const t=xs(e);Sl(e,C.some(t),C.none()),ra(e)},la=e=>{const t=(e=>Fo(e)+"px")(e);Sl(e,C.some(t),C.none()),ra(e)},aa=e=>{Ao(e,"width");const t=cr(e),o=t.length>0?t:ar(e);_(o,e=>{Ao(e,"width"),ra(e)}),ra(e)},ca={scope:["row","col"]},ia=e=>()=>{const t=Me.fromTag("td",e.dom);return ao(t,Me.fromTag("br",e.dom)),t},ma=e=>()=>Me.fromTag("col",e.dom),da=e=>()=>Me.fromTag("colgroup",e.dom),ua=e=>()=>Me.fromTag("tr",e.dom),fa=(e,t,o)=>{const n=((e,t)=>{const o=Ro(e,t),n=Kt(So(e));return mo(o,n),o})(e,t);return G(o,(e,t)=>{null===e?bo(n,t):fo(n,t,e)}),n},ga=e=>e,ha=(e,t,o)=>{const n=(e,t)=>{((e,t)=>{const o=e.dom,n=t.dom;Do(o)&&Do(n)&&(n.style.cssText=o.style.cssText)})(e.element,t),Ao(t,"height"),1!==e.colspan&&Ao(t,"width")};return{col:o=>{const r=Me.fromTag(Nt(o.element),t.dom);return n(o,r),e(o.element,r),r},colgroup:da(t),row:ua(t),cell:r=>{const s=Me.fromTag(Nt(r.element),t.dom),l=o.getOr(["strong","em","b","i","span","font","h1","h2","h3","h4","h5","h6","p","div"]),a=l.length>0?((e,t,o)=>Tn(e).map(n=>{const r=o.join(","),s=bn(n,r,t=>Je(t,e));return z(s,(e,t)=>{const o=To(t);return ao(e,o),o},t)}).getOr(t))(r.element,s,l):s;return ao(a,Me.fromTag("br")),n(r,s),((e,t)=>{G(ca,(o,n)=>po(e,n).filter(e=>D(o,e)).each(e=>fo(t,n,e)))})(r.element,s),e(r.element,s),s},replace:fa,colGap:ma(t),gap:ia(t)}},pa=e=>({col:ma(e),colgroup:da(e),row:ua(e),cell:ia(e),replace:ga,colGap:ma(e),gap:ia(e)}),ba=e=>Dr(e).grid,wa=(e,t,o,n)=>{const r=ze(e).rows;let s=!0;for(let e=0;e({rowDelta:0,colDelta:Be(e[0])-Be(t[0])}),ya=(e,t)=>({rowDelta:e.length-t.length,colDelta:0}),xa=(e,t,o,n)=>{const r="colgroup"===t.section?o.col:o.cell;return k(e,e=>Se(r(),!0,n(e)))},Ca=(e,t,o,n)=>{const r=e[e.length-1];return e.concat(k(t,()=>{const e="colgroup"===r.section?o.colgroup:o.row,t=Ae(r,e,h),s=xa(t.cells.length,t,o,e=>X(n,e.toString()));return Ee(t,s)}))},Ta=(e,t,o,n)=>E(e,e=>{const r=xa(t,e,o,y);return De(e,n,r)}),Sa=(e,t,o)=>{const n=t.colDelta<0?Ta:h,r=t.rowDelta<0?Ca:h,s=Cr(e),l=Be(e[0]),a=O(s,e=>e===l-1),c=n(e,Math.abs(t.colDelta),o,a?l-1:l),i=Cr(c);return r(c,Math.abs(t.rowDelta),o,I(i,x))},Ra=(e,t,o,n)=>{const r=b(n,_e(e[t],o).element),s=e[t];return e.length>1&&Be(s)>1&&(o>0&&r(Ne(s,o-1))||o0&&r(Ne(e[t-1],o))||tB(o,o=>o>=e.column&&o<=Be(t[0])+e.column),Oa=(e,t,o,n,r)=>{((e,t,o,n)=>{t>0&&t{const r=e.cells[t-1];let s=0;const l=n();for(;e.cells.length>t+s&&o(r.element,e.cells[t+s].element);)ke(e,t+s,Se(l,!0,e.cells[t+s].isLocked)),s++})})(t,e,r,n.cell);const s=ya(o,t),l=Sa(o,s,n),a=ya(t,l),c=Sa(t,a,n);return E(c,(t,o)=>De(t,e,l[o].cells))},ka=(e,t,o,n,r)=>{((e,t,o,n)=>{const r=ze(e).rows;if(t>0&&tA(e,(e,o)=>O(e,e=>t(e.element,o.element))?e:e.concat([o]),[]))(r[t-1].cells,o);_(e,e=>{let s=C.none();for(let l=t;l{ke(a,t,Se(e,!0,c.isLocked))}))}})}})(t,e,r,n.cell);const s=Cr(t),l=va(t,o),a={...l,colDelta:l.colDelta-s.length},c=Sa(t,a,n),{cols:i,rows:m}=ze(c),d=Cr(c),u=va(o,t),f={...u,colDelta:u.colDelta+d.length},g=(p=n,b=d,E(o,e=>A(b,(t,o)=>{const n=xa(1,e,p,x)[0];return Oe(t,o,n)},e))),h=Sa(g,f,n);var p,b;return[...i,...m.slice(0,e),...h,...m.slice(e,m.length)]},Ea=(e,t,o,n,r)=>{const{rows:s,cols:l}=ze(e),a=s.slice(0,t),c=s.slice(t);return[...l,...a,((e,t,o,n)=>Ae(e,e=>n(e,o),t))(s[o],(e,o)=>t>0&&tE(e,e=>{const s=t>0&&t{if("colgroup"!==o&&n)return _e(e,t);{const t=_e(e,r);return Se(l(t.element,s),!0,!1)}})(e,t,e.section,s,o,n,r);return Oe(e,t,l)}),Na=(e,t,o,n)=>((e,t,o,n)=>void 0!==Ne(e[t],o)&&t>0&&n(Ne(e[t-1],o),Ne(e[t],o)))(e,t,o,n)||((e,t,o)=>t>0&&o(Ne(e,t-1),Ne(e,t)))(e[t],o,n),Ba=(e,t,o,n)=>{const r=e=>(e=>"row"===e?(e=>Zn(e,"rowspan")>1)(t):er(t))(e)?`${e}group`:e;return e?ur(t)?r(o):null:n&&ur(t)?r("row"===o?"col":"row"):null},za=(e,t,o)=>Se(o(e.element,t),!0,e.isLocked),Aa=(e,t,o,n,r,s,l)=>E(e,(e,a)=>(e=>{const c=e.cells,i=E(c,(e,c)=>{if((e=>O(t,t=>o(e.element,t.element)))(e)){const t=l(e,a,c)?r(e,o,n):e;return s(t,a,c).each(e=>{var o,n;o=t.element,n={scope:C.from(e)},G(n,(e,t)=>{e.fold(()=>{bo(o,t)},e=>{uo(o.dom,t,e)})})}),t}return e});return Re(e.element,i,e.section,e.isNew)})(e)),La=(e,t,o)=>j(e,(n,r)=>Na(e,r,t,o)?[]:[_e(n,t)]),Ma=(e,t,o,n,r)=>{const s=ze(e).rows,l=j(t,e=>La(s,e,n)),a=E(s,e=>fr(e.cells)),c=((e,t)=>P(t,h)&&fr(e)?x:(e,o,n)=>!("th"===Nt(e.element)&&t[o]))(l,a),i=((e,t)=>(o,n)=>C.some(Ba(e,o.element,"row",t[n])))(o,a);return Aa(e,l,n,r,za,i,c)},Wa=(e,t,o,n)=>{const r=ze(e).rows,s=E(t,e=>_e(r[e.row],e.column));return Aa(e,s,o,n,za,C.none,x)},ja=e=>A(e,(e,t)=>O(e,e=>e.column===t.column)?e:e.concat([t]),[]).sort((e,t)=>e.column-t.column),Pa=e=>gn(e,!0),Ia=e=>{0===ar(e).length&&yo(e)},Fa=(e,t)=>({grid:e,cursor:t}),Ha=(e,t,o)=>{const n=((e,t,o)=>{const n=ze(e).rows;return C.from(n[t]?.cells[o]?.element).filter(Pa).orThunk(()=>(e=>V(e,e=>V(e.cells,e=>{const t=e.element;return de(Pa(t),t)})))(n))})(e,t,o);return Fa(e,n)},$a=e=>A(e,(e,t)=>O(e,e=>e.row===t.row)?e:e.concat([t]),[]).sort((e,t)=>e.row-t.row),Va=(e,t,o,n)=>{const r=t[0].row,s=$a(t),l=z(s,(e,t)=>({grid:Ea(e.grid,r,t.row+e.delta,o,n.getOrInit),delta:e.delta+1}),{grid:e,delta:0}).grid;return Ha(l,r,t[0].column)},qa=(e,t,o,n)=>{const r=$a(t),s=r[r.length-1],l=s.row+s.rowspan,a=z(r,(e,t)=>Ea(e,l,t.row,o,n.getOrInit),e);return Ha(a,l,t[0].column)},Ua=(e,t,o,n)=>{const r=t.details,s=ja(r),l=s[0].column,a=z(s,(e,t)=>({grid:_a(e.grid,l,t.column+e.delta,o,n.getOrInit),delta:e.delta+1}),{grid:e,delta:0}).grid;return Ha(a,r[0].row,l)},Ga=(e,t,o,n)=>{const r=t.details,s=r[r.length-1],l=s.column+s.colspan,a=ja(r),c=z(a,(e,t)=>_a(e,l,t.column,o,n.getOrInit),e);return Ha(c,r[0].row,l)},Ka=(e,t,o,n)=>{const r=ja(t),s=E(r,e=>e.column),l=Ma(e,s,!0,o,n.replaceOrInit);return Ha(l,t[0].row,t[0].column)},Ya=(e,t,o,n)=>{const r=Wa(e,t,o,n.replaceOrInit);return Ha(r,t[0].row,t[0].column)},Ja=(e,t,o,n)=>{const r=ja(t),s=E(r,e=>e.column),l=Ma(e,s,!1,o,n.replaceOrInit);return Ha(l,t[0].row,t[0].column)},Qa=(e,t,o,n)=>{const r=Wa(e,t,o,n.replaceOrInit);return Ha(r,t[0].row,t[0].column)},Xa=(e,t)=>(o,n,r,s,l)=>{const a=$a(n),c=E(a,e=>e.row),i=((e,t,o,n,r,s,l)=>{const{cols:a,rows:c}=ze(e),i=c[t[0]],m=j(t,e=>((e,t,o)=>{const n=e[t];return j(n.cells,(n,r)=>Na(e,t,r,o)?[]:[n])})(c,e,r)),d=E(i.cells,(e,t)=>fr(La(c,t,r))),u=[...c];_(t,e=>{u[e]=l.transformRow(c[e],o)});const f=[...a,...u],g=((e,t)=>P(t,h)&&fr(e.cells)?x:(e,o,n)=>!("th"===Nt(e.element)&&t[n]))(i,d),p=((e,t)=>(o,n,r)=>C.some(Ba(e,o.element,"col",t[r])))(n,d);return Aa(f,m,r,s,l.transformCell,p,g)})(o,c,e,t,r,s.replaceOrInit,l);return Ha(i,n[0].row,n[0].column)},Za=Xa("thead",!0),ec=Xa("tbody",!1),tc=Xa("tfoot",!1),oc=(e,t,o,n)=>{const r=ja(t.details),s=((e,t)=>j(e,e=>{const o=e.cells,n=z(t,(e,t)=>t>=0&&t0?[Re(e.element,n,e.section,e.isNew)]:[]}))(e,E(r,e=>e.column)),l=s.length>0?s[0].cells.length-1:0;return Ha(s,r[0].row,Math.min(r[0].column,l))},nc=(e,t,o,n)=>{const r=$a(t),s=((e,t,o)=>{const{rows:n,cols:r}=ze(e);return[...r,...n.slice(0,t),...n.slice(o+1)]})(e,r[0].row,r[r.length-1].row),l=Math.max(ze(s).rows.length-1,0);return Ha(s,Math.min(t[0].row,l),t[0].column)},rc=(e,t,o,n)=>{const r=t.cells;na(r);const s=((e,t,o,n)=>{const r=ze(e).rows;if(0===r.length)return e;for(let e=t.startRow;e<=t.finishRow;e++)for(let o=t.startCol;o<=t.finishCol;o++){const t=r[e],s=_e(t,o).isLocked;ke(t,o,Se(n(),!1,s))}return e})(e,t.bounds,0,n.merge(r));return Fa(s,C.from(r[0]))},sc=(e,t,o,n)=>{const r=z(t,(e,t)=>wa(e,t,o,n.unmerge(t)),e);return Fa(r,C.from(t[0]))},lc=(e,t,o,n)=>{const r=((e,t)=>{const o=Dr(e);return Hs(o,t,!0)})(t.clipboard,t.generators);var s,l;return((e,t,o,n,r)=>{const s=Cr(t),l=((e,t,o)=>{const n=Be(t[0]),r=ze(t).cols.length+e.row,s=k(n-e.column,t=>t+e.column);return{row:r,column:L(s,e=>P(o,t=>t!==e)).getOr(n-1)}})(e,t,s),a=ze(o).rows,c=Da(l,a,s),i=((e,t,o)=>{if(e.row>=t.length||e.column>Be(t[0]))return le.error("invalid start address out of table bounds, row: "+e.row+", column: "+e.column);const n=t.slice(e.row),r=n[0].cells.slice(e.column),s=Be(o[0]),l=o.length;return le.value({rowDelta:n.length-l,colDelta:r.length-s})})(l,t,a);return i.map(e=>{const o={...e,colDelta:e.colDelta-c.length},s=Sa(t,o,n),i=Cr(s),m=Da(l,a,i);return((e,t,o,n,r,s)=>{const l=e.row,a=e.column,c=l+o.length,i=a+Be(o[0])+s.length,m=I(s,x);for(let e=l;eFa(e,C.some(t.element)),e=>Ha(e,t.row,t.column))},ac=(e,t,o)=>{const n=((e,t)=>br(e,()=>t))(e,o.section),r=Or(n);return Hs(r,t,!0)},cc=(e,t,o,n)=>{const r=ze(e).rows,s=t.cells[0].column,l=r[t.cells[0].row],a=ac(t.clipboard,t.generators,l),c=Oa(s,e,a,t.generators,o);return Ha(c,t.cells[0].row,t.cells[0].column)},ic=(e,t,o,n)=>{const r=ze(e).rows,s=t.cells[t.cells.length-1].column+t.cells[t.cells.length-1].colspan,l=r[t.cells[0].row],a=ac(t.clipboard,t.generators,l),c=Oa(s,e,a,t.generators,o);return Ha(c,t.cells[0].row,s)},mc=(e,t,o,n)=>{const r=ze(e).rows,s=t.cells[0].row,l=r[s],a=ac(t.clipboard,t.generators,l),c=ka(s,e,a,t.generators,o);return Ha(c,t.cells[0].row,t.cells[0].column)},dc=(e,t,o,n)=>{const r=ze(e).rows,s=t.cells[t.cells.length-1].row+t.cells[t.cells.length-1].rowspan,l=r[t.cells[0].row],a=ac(t.clipboard,t.generators,l),c=ka(s,e,a,t.generators,o);return Ha(c,s,t.cells[0].column)},uc=(e,t,o,n)=>((e,t,o,n)=>{const r=Or(t),s=n.getWidths(r,n);tl(r,s,n)})(0,t,0,n.sizing),fc=(e,t,o,n)=>((e,t,o,n,r)=>{const s=Or(t),l=n.getWidths(s,n),a=n.pixelWidth(),{newSizes:c,delta:i}=r.calcRedestributedWidths(l,a,o.pixelDelta,n.isRelative);tl(s,c,n),n.adjustTableWidth(i)})(0,t,o,n.sizing,n.resize),gc=(e,t)=>O(t,e=>0===e.column&&e.isLocked),hc=(e,t)=>O(t,t=>t.column+t.colspan>=e.grid.columns&&t.isLocked),pc=(e,t)=>{const o=Vr(e),n=ja(t);return A(n,(e,t)=>e+o[t.column].map(Ho).getOr(0),0)},bc=e=>(t,o)=>Ys(t,o).filter(o=>!(e?gc:hc)(t,o)).map(e=>({details:e,pixelDelta:pc(t,e)})),wc=(e,t)=>Js(e,t).map(t=>({details:t,pixelDelta:-pc(e,t)})),vc=e=>(t,o)=>Ks(t,o).filter(o=>!(e?gc:hc)(t,o.cells)),yc=gl("th"),xc=gl("td"),Cc=(e,t,o,n)=>Us(Va,Ys,f,f,fl,e,t,o,n),Tc=(e,t,o,n)=>Us(qa,Ys,f,f,fl,e,t,o,n),Sc=(e,t,o,n)=>Us(Ua,bc(!0),fc,f,fl,e,t,o,n),Rc=(e,t,o,n)=>Us(Ga,bc(!1),fc,f,fl,e,t,o,n),Dc=(e,t,o,n)=>Us(oc,wc,fc,Ia,fl,e,t,o,n),Oc=(e,t,o,n)=>Us(nc,Ys,f,Ia,fl,e,t,o,n),kc=(e,t,o,n)=>Us(Ka,Js,f,f,yc,e,t,o,n),Ec=(e,t,o,n)=>Us(Ja,Js,f,f,xc,e,t,o,n),_c=(e,t,o,n)=>Us(Za,Ys,f,f,yc,e,t,o,n),Nc=(e,t,o,n)=>Us(ec,Ys,f,f,xc,e,t,o,n),Bc=(e,t,o,n)=>Us(tc,Ys,f,f,xc,e,t,o,n),zc=(e,t,o,n)=>Us(Ya,Js,f,f,yc,e,t,o,n),Ac=(e,t,o,n)=>Us(Qa,Js,f,f,xc,e,t,o,n),Lc=(e,t,o,n)=>Us(rc,Xs,uc,f,hl,e,t,o,n),Mc=(e,t,o,n)=>Us(sc,Zs,uc,f,hl,e,t,o,n),Wc=(e,t,o,n)=>Us(lc,Gs,uc,f,fl,e,t,o,n),jc=(e,t,o,n)=>Us(cc,vc(!0),f,f,fl,e,t,o,n),Pc=(e,t,o,n)=>Us(ic,vc(!1),f,f,fl,e,t,o,n),Ic=(e,t,o,n)=>Us(mc,Ks,f,f,fl,e,t,o,n),Fc=(e,t,o,n)=>Us(dc,Ks,f,f,fl,e,t,o,n),Hc=(e,t)=>{const o=Dr(e);return Ys(o,t).bind(e=>{const t=e[e.length-1],n=e[0].column,r=t.column+t.colspan,s=W(E(o.all,e=>B(e.cells,e=>e.column>=n&&e.column{const o=Dr(e);return Ys(o,t).bind(pr).getOr("")},Vc=(e,t)=>{const o=Dr(e);return Ys(o,t).bind(e=>{const t=e[e.length-1],n=e[0].row,r=t.row+t.rowspan;return(e=>{const t=E(e,e=>hr(e).type),o=D(t,"header"),n=D(t,"footer");if(o||n){const e=D(t,"body");return!o||e||n?o||e||!n?C.none():C.some("footer"):C.some("header")}return C.some("body")})(o.all.slice(n,r))}).getOr("")},qc=(e,t)=>{const o=t.column,n=t.column+t.colspan-1,r=t.row,s=t.row+t.rowspan-1;return o<=e.finishCol&&n>=e.startCol&&r<=e.finishRow&&s>=e.startRow},Uc=(e,t)=>t.column>=e.startCol&&t.column+t.colspan-1<=e.finishCol&&t.row>=e.startRow&&t.row+t.rowspan-1<=e.finishRow,Gc=(e,t,o)=>{const n=Er(e,t,Je),r=Er(e,o,Je);return n.bind(e=>r.map(t=>{return o=e,n=t,{startRow:Math.min(o.row,n.row),startCol:Math.min(o.column,n.column),finishRow:Math.max(o.row+o.rowspan-1,n.row+n.rowspan-1),finishCol:Math.max(o.column+o.colspan-1,n.column+n.colspan-1)};var o,n}))},Kc=(e,t,o)=>Gc(e,t,o).map(t=>{const o=_r(e,b(qc,t));return E(o,e=>e.element)}),Yc=(e,t)=>Er(e,t,(e,t)=>Qe(t,e)).map(e=>e.element),Jc=(e,t,o)=>{const n=Xc(e);return Kc(n,t,o)},Qc=(e,t,o,n,r)=>{const s=Xc(e),l=Je(e,o)?C.some(t):Yc(s,t),a=Je(e,r)?C.some(n):Yc(s,n);return l.bind(e=>a.bind(t=>Kc(s,e,t)))},Xc=Dr,Zc={styles:{"border-collapse":"collapse",width:"100%"},attributes:{border:"1"},colGroups:!1},ei=()=>Me.fromTag("th"),ti=()=>Me.fromTag("td"),oi=(e,t,o,n)=>k(e,e=>((e,t,o,n)=>{const r=Me.fromTag("tr");for(let s=0;s{let t=[];return{bind:e=>{if(void 0===e)throw new Error("Event bind error: undefined handler");t.push(e)},unbind:e=>{t=B(t,t=>t!==e)},trigger:(...o)=>{const n={};_(e,(e,t)=>{n[e]=o[t]}),_(t,e=>{e(n)})}}},ri=e=>({registry:K(e,e=>({bind:e.bind,unbind:e.unbind})),trigger:K(e,e=>e.trigger)}),si=ne(["compare","extract","mutate","sink"]),li=ne(["element","start","stop","destroy"]),ai=ne(["forceDrop","drop","move","delayDrop"]),ci=()=>{const e=(()=>{const e=ri({move:ni(["info"])});return{onEvent:f,reset:f,events:e.registry}})(),t=(()=>{let e=C.none();const t=ri({move:ni(["info"])});return{onEvent:(o,n)=>{n.extract(o).each(o=>{const r=((t,o)=>{const n=e.map(e=>t.compare(e,o));return e=C.some(o),n})(n,o);r.each(e=>{t.trigger.move(e)})})},reset:()=>{e=C.none()},events:t.registry}})();let o=e;return{on:()=>{o.reset(),o=t},off:()=>{o.reset(),o=e},isOn:()=>o===t,onEvent:(e,t)=>{o.onEvent(e,t)},events:t.events}},ii=ce("ephox-dragster").resolve;var mi=si({compare:(e,t)=>qo(t.left-e.left,t.top-e.top),extract:e=>C.some(qo(e.x,e.y)),sink:(e,t)=>{const o=(e=>{const t={layerClass:ii("blocker"),...e},o=Me.fromTag("div");return fo(o,"role","presentation"),fo(o,"data-mce-bogus","all"),_o(o,{position:"fixed",left:"0px",top:"0px",width:"100%",height:"100%"}),dn(o,ii("blocker")),dn(o,t.layerClass),{element:g(o),destroy:()=>{yo(o)}}})(t),n=oo(o.element(),"mousedown",e.forceDrop),r=oo(o.element(),"mouseup",e.drop),s=oo(o.element(),"mousemove",e.move),l=oo(o.element(),"mouseout",e.delayDrop);return li({element:o.element,start:e=>{ao(e,o.element())},stop:()=>{yo(o.element())},destroy:()=>{o.destroy(),r.unbind(),s.unbind(),l.unbind(),n.unbind()}})},mutate:(e,t)=>{e.mutate(t.left,t.top)}});const di=ce("ephox-snooker").resolve,ui=di("resizer-bar"),fi=di("resizer-rows"),gi=di("resizer-cols"),hi=e=>{const t=vn(e.parent(),"."+ui);_(t,yo)},pi=(e,t,o)=>{const n=e.origin();_(t,t=>{t.each(t=>{const r=o(n,t);dn(r,ui),ao(e.parent(),r)})})},bi=(e,t,o,n,r)=>{const s=Go(o),l=t.isResizable,a=n.length>0?ns.positions(n,o):[],c=a.length>0?((e,t)=>j(e.all,(e,o)=>t(e.element)?[o]:[]))(e,l):[];((e,t,o,n)=>{pi(e,t,(e,t)=>{const r=((e,t,o,n)=>{const r=Me.fromTag("div");return _o(r,{position:"absolute",left:t+"px",top:o-3.5+"px",height:"7px",width:n+"px"}),go(r,{"data-mce-bogus":"all","data-row":e,role:"presentation"}),r})(t.row,o.left-e.left,t.y-e.top,n);return dn(r,fi),r})})(t,B(a,(e,t)=>O(c,e=>t===e)),s,Ho(o));const i=r.length>0?ss.positions(r,o):[],m=i.length>0?((e,t)=>{const o=[];return k(e.grid.columns,n=>{Ar(e,n).map(e=>e.element).forall(t)&&o.push(n)}),B(o,o=>{const n=_r(e,e=>e.column===o);return P(n,e=>t(e.element))})})(e,l):[];((e,t,o,n)=>{pi(e,t,(e,t)=>{const r=((e,t,o,n,r)=>{const s=Me.fromTag("div");return _o(s,{position:"absolute",left:t-3.5+"px",top:o+"px",height:r+"px",width:"7px"}),go(s,{"data-mce-bogus":"all","data-column":e,role:"presentation"}),s})(t.col,t.x-e.left,o.top-e.top,0,n);return dn(r,gi),r})})(t,B(i,(e,t)=>O(m,e=>t===e)),s,Po(o))},wi=(e,t)=>{if(hi(e),e.isResizable(t)){const o=Dr(t),n=Ur(o),r=Vr(o);bi(o,e,t,n,r)}},vi=(e,t)=>{const o=vn(e.parent(),"."+ui);_(o,t)},yi=e=>{vi(e,e=>{Eo(e,"display","none")})},xi=e=>{vi(e,e=>{Eo(e,"display","block")})},Ci=di("resizer-bar-dragging"),Ti=e=>{const t=(()=>{const e=ri({drag:ni(["xDelta","yDelta","target"])});let t=C.none();const o=(()=>{const e=ri({drag:ni(["xDelta","yDelta"])});return{mutate:(t,o)=>{e.trigger.drag(t,o)},events:e.registry}})();return o.events.drag.bind(o=>{t.each(t=>{e.trigger.drag(o.xDelta,o.yDelta,t)})}),{assign:e=>{t=C.some(e)},get:()=>t,mutate:o.mutate,events:e.registry}})(),o=((e,t={})=>((e,t,o)=>{let n=!1;const r=ri({start:ni([]),stop:ni([])}),s=ci(),l=()=>{m.stop(),s.isOn()&&(s.off(),r.trigger.stop())},c=(e=>{let t=null;const o=()=>{a(t)||(clearTimeout(t),t=null)};return{cancel:o,throttle:(...n)=>{o(),t=setTimeout(()=>{t=null,e.apply(null,n)},200)}}})(l);s.events.move.bind(o=>{t.mutate(e,o.info)});const i=e=>(...t)=>{n&&e.apply(null,t)},m=t.sink(ai({forceDrop:l,drop:i(l),move:i(e=>{c.cancel(),s.onEvent(e,t)}),delayDrop:i(c.throttle)}),o);return{element:m.element,go:e=>{m.start(e),s.on(),r.trigger.start()},on:()=>{n=!0},off:()=>{n=!1},isActive:()=>n,destroy:()=>{m.destroy()},events:r.registry}})(e,t.mode??mi,t))(t,{});let n=C.none();const r=(e,t)=>C.from(ho(e,t));t.events.drag.bind(e=>{r(e.target,"data-row").each(t=>{const o=tr(e.target,"top");Eo(e.target,"top",o+e.yDelta+"px")}),r(e.target,"data-column").each(t=>{const o=tr(e.target,"left");Eo(e.target,"left",o+e.xDelta+"px")})});const s=(e,t)=>tr(e,t)-Xn(e,"data-initial-"+t,0);o.events.stop.bind(()=>{t.get().each(t=>{n.each(o=>{r(t,"data-row").each(e=>{const n=s(t,"top");bo(t,"data-initial-top"),d.trigger.adjustHeight(o,n,parseInt(e,10))}),r(t,"data-column").each(e=>{const n=s(t,"left");bo(t,"data-initial-left"),d.trigger.adjustWidth(o,n,parseInt(e,10))}),wi(e,o)})})});const l=(n,r)=>{d.trigger.startAdjust(),t.assign(n),fo(n,"data-initial-"+r,tr(n,r)),dn(n,Ci),Eo(n,"opacity","0.2"),o.go(e.dragContainer())},c=oo(e.parent(),"mousedown",e=>{var t;t=e.target,un(t,fi)&&(e.prevent(),e.stop(),l(e.target,"top")),(e=>un(e,gi))(e.target)&&(e.prevent(),e.stop(),l(e.target,"left"))}),i=t=>Je(t,e.view()),m=oo(e.view(),"mouseover",t=>{var r;(r=t.target,an(r,"table",i).filter(gn)).fold(()=>{Oo(t.target)&&!(e=>un(e,"ephox-snooker-resizer-bar")||un(e,"ephox-dragster-blocker"))(t.target)&&hi(e)},t=>{o.isActive()&&(n=C.some(t),wi(e,t))})}),d=ri({adjustHeight:ni(["table","delta","row"]),adjustWidth:ni(["table","delta","column"]),startAdjust:ni([])});return{destroy:()=>{c.unbind(),m.unbind(),o.destroy(),hi(e)},refresh:t=>{wi(e,t)},on:o.on,off:o.off,hideBars:b(yi,e),showBars:b(xi,e),events:d.registry}},Si=e=>t=>t.options.get(e),Ri="100%",Di=e=>{const t=e.dom,o=t.getParent(e.selection.getStart(),t.isBlock)??e.getBody();return $o(Me.fromDom(o))+"px"},Oi=e=>C.from(e.options.get("table_clone_elements")),ki=Si("table_header_type"),Ei=Si("table_column_resizing"),_i=e=>"preservetable"===Ei(e),Ni=e=>"resizetable"===Ei(e),Bi=Si("table_sizing_mode"),zi=e=>"relative"===Bi(e),Ai=e=>"fixed"===Bi(e),Li=e=>"responsive"===Bi(e),Mi=Si("table_resize_bars"),Wi=Si("table_style_by_css"),ji=Si("table_merge_content_on_paste"),Pi=Si("table_default_header_rows"),Ii=Si("table_default_header_cols"),Fi=e=>{const t=e.options,o=t.get("table_default_attributes");return t.isSet("table_default_attributes")?o:((e,t)=>Li(e)||Wi(e)?t:Ai(e)?{...t,width:Di(e)}:{...t,width:Ri})(e,o)},Hi=Si("table_use_colgroups"),$i=e=>Me.fromDom(e.getBody()),Vi=e=>t=>Je(t,$i(e)),qi=e=>{bo(e,"data-mce-style");const t=e=>bo(e,"data-mce-style");_(ar(e),t),_(cr(e),t),_(mr(e),t)},Ui=e=>Me.fromDom(e.selection.getStart()),Gi=e=>e.getBoundingClientRect().width,Ki=e=>e.getBoundingClientRect().height,Yi=e=>/^\d+(\.\d+)?$/.test(e)?e+"px":e,Ji=e=>(t,o)=>{const n=t.dom.getStyle(o,e)||t.dom.getAttrib(o,e);return C.from(n).filter(ve).map(Yi)},Qi=Ji("width"),Xi=Ji("height"),Zi=e=>nn(e,It("table")).exists(gn),em=e=>rn(e,"table"),tm=(e,t,o)=>{const n=e=>t=>void 0!==o&&o(t)||Je(t,e);return Je(e,t)?C.some({boxes:C.some([e]),start:e,finish:t}):em(e).bind(r=>em(t).bind(s=>{if(Je(r,s))return C.some({boxes:Jc(r,e,t),start:e,finish:t});if(Qe(r,s)){const o=bn(t,"td,th",n(r)),l=o.length>0?o[o.length-1]:t;return C.some({boxes:Qc(r,e,r,t,s),start:e,finish:l})}if(Qe(s,r)){const o=bn(e,"td,th",n(s)),l=o.length>0?o[o.length-1]:e;return C.some({boxes:Qc(s,e,r,t,s),start:e,finish:l})}return((e,t)=>((e,t,o,n=y)=>{const r=[t].concat(e.up().all(t)),s=[o].concat(e.up().all(o)),l=e=>M(e,n).fold(()=>e,t=>e.slice(0,t+1)),a=l(r),c=l(s),i=L(a,t=>O(c,((e,t)=>b(e.eq,t))(e,t)));return{firstpath:a,secondpath:c,shared:i}})(Xl,e,t,void 0))(e,t).shared.bind(l=>an(l,"table",o).bind(o=>{const l=bn(t,"td,th",n(o)),a=l.length>0?l[l.length-1]:t,c=bn(e,"td,th",n(o)),i=c.length>0?c[c.length-1]:e;return C.some({boxes:Qc(o,e,r,t,s),start:i,finish:a})}))}))},om=(e,t)=>{const o=vn(e,t);return o.length>0?C.some(o):C.none()},nm=(e,t,o)=>ln(e,t).bind(t=>ln(e,o).bind(e=>Zl(em,[t,e]).map(o=>({first:t,last:e,table:o})))),rm=(e,t,o,n,r)=>((e,t)=>L(e,e=>Ge(e,t)))(e,r).bind(e=>((e,t,o)=>ir(e).bind(n=>((e,t,o,n)=>Er(e,t,Je).bind(t=>{const r=o>0?t.row+t.rowspan-1:t.row,s=n>0?t.column+t.colspan-1:t.column;return kr(e,r+o,s+n).map(e=>e.element)}))(Xc(n),e,t,o)))(e,t,o).bind(e=>((e,t)=>rn(e,"table").bind(o=>ln(o,t).bind(t=>tm(t,e).bind(e=>e.boxes.map(t=>({boxes:t,start:e.start,finish:e.finish}))))))(e,n))),sm=(e,t)=>om(e,t),lm=(e,t,o)=>nm(e,t,o).bind(t=>{const o=t=>Je(e,t),n="thead,tfoot,tbody,table",r=rn(t.first,n,o),s=rn(t.last,n,o);return r.bind(e=>s.bind(o=>Je(e,o)?((e,t,o)=>((e,t,o)=>Gc(e,t,o).bind(t=>((e,t)=>{let o=!0;const n=b(Uc,t);for(let r=t.startRow;r<=t.finishRow;r++)for(let s=t.startCol;s<=t.finishCol;s++)o=o&&kr(e,r,s).exists(n);return o?C.some(t):C.none()})(e,t)))(Xc(e),t,o))(t.table,t.first,t.last):C.none()))}),am=h,cm=e=>{const t=(e,t)=>po(e,t).exists(e=>parseInt(e,10)>1);return e.length>0&&P(e,e=>t(e,"rowspan")||t(e,"colspan"))?C.some(e):C.none()},im=(e,t,o)=>t.length<=1?C.none():lm(e,o.firstSelectedSelector,o.lastSelectedSelector).map(e=>({bounds:e,cells:t})),mm=(e,t)=>({selection:e,kill:t}),dm=()=>({tag:"none"}),um=e=>({tag:"multiple",elements:e}),fm=e=>({tag:"single",element:e}),gm=(e,t,o,n)=>({start:kn.on(e,t),finish:kn.on(o,n)}),hm=(e,t)=>{const o=Ue(e,t);return Dn(Me.fromDom(o.startContainer),o.startOffset,Me.fromDom(o.endContainer),o.endOffset)},pm=gm,bm=(e,t,o,n,r)=>Je(o,n)?C.none():tm(o,n,t).bind(t=>{const n=t.boxes.getOr([]);return n.length>1?(r(e,n,t.start,t.finish),C.some(mm(C.some(pm(o,0,o,yn(o))),!0))):C.none()}),wm=Z([{none:["message"]},{success:[]},{failedUp:["cell"]},{failedDown:["cell"]}]),vm=e=>an(e,"tr"),ym={...wm,verify:(e,t,o,n,r,s,l)=>an(n,"td,th",l).bind(o=>an(t,"td,th",l).map(t=>Je(o,t)?Je(n,o)&&yn(o)===r?s(t):wm.none("in same cell"):Zl(vm,[o,t]).fold(()=>((e,t,o)=>{const n=e.getRect(t),r=e.getRect(o);return r.right>n.left&&r.lefts(t)))).getOr(wm.none("default")),cata:(e,t,o,n,r)=>e.fold(t,o,n,r)},xm=It("br"),Cm=(e,t,o)=>t(e,o).bind(e=>Wt(e)&&0===Jo(e).trim().length?Cm(e,t,o):C.some(e)),Tm=(e,t,o,n)=>((e,t)=>Yt(e,t).filter(xm).orThunk(()=>Yt(e,t-1).filter(xm)))(t,o).bind(t=>n.traverse(t).fold(()=>Cm(t,n.gather,e).map(n.relative),e=>(e=>$t(e).bind(t=>{const o=Kt(t);return((e,t)=>M(e,b(Je,t)))(o,e).map(n=>((e,t,o,n)=>({parent:e,children:t,element:o,index:n}))(t,o,e,n))}))(e).map(e=>kn.on(e.parent,e.index)))),Sm=(e,t)=>({left:e.left,top:e.top+t,right:e.right,bottom:e.bottom+t}),Rm=(e,t)=>({left:e.left,top:e.top-t,right:e.right,bottom:e.bottom-t}),Dm=(e,t,o)=>({left:e.left+t,top:e.top+o,right:e.right+t,bottom:e.bottom+o}),Om=e=>({left:e.left,top:e.top,right:e.right,bottom:e.bottom}),km=(e,t)=>C.some(e.getRect(t)),Em=(e,t,o)=>Mt(t)?km(e,t).map(Om):Wt(t)?((e,t,o)=>o>=0&&o0?e.getRangedRect(t,o-1,t,o):C.none())(e,t,o).map(Om):C.none(),_m=(e,t)=>Mt(t)?km(e,t).map(Om):Wt(t)?e.getRangedRect(t,0,t,yn(t)).map(Om):C.none(),Nm=Z([{none:[]},{retry:["caret"]}]),Bm=(e,t,o)=>nn(t,ta).fold(y,t=>_m(e,t).exists(e=>((e,t)=>e.leftt.right)(o,e))),zm={point:e=>e.bottom,adjuster:(e,t,o,n,r)=>{const s=Sm(r,5);return Math.abs(o.bottom-n.bottom)<1||o.top>r.bottom?Nm.retry(s):o.top===r.bottom?Nm.retry(Sm(r,1)):Bm(e,t,r)?Nm.retry(Dm(s,5,0)):Nm.none()},move:Sm,gather:Kl},Am=(e,t,o,n,r)=>0===r?C.some(n):((e,t,o)=>e.elementFromPoint(t,o).filter(e=>"table"===Nt(e)).isSome())(e,n.left,t.point(n))?((e,t,o,n,r)=>Am(e,t,o,t.move(n,5),r))(e,t,o,n,r-1):e.situsFromPoint(n.left,t.point(n)).bind(s=>s.start.fold(C.none,s=>_m(e,s).bind(l=>t.adjuster(e,s,l,o,n).fold(C.none,n=>Am(e,t,o,n,r-1))).orThunk(()=>C.some(n)),C.none)),Lm=(e,t,o)=>{const n=e.move(o,5),r=Am(t,e,o,n,100).getOr(n);return((e,t,o)=>e.point(t)>o.getInnerHeight()?C.some(e.point(t)-o.getInnerHeight()):e.point(t)<0?C.some(-e.point(t)):C.none())(e,r,t).fold(()=>t.situsFromPoint(r.left,e.point(r)),o=>(t.scrollBy(0,o),t.situsFromPoint(r.left,e.point(r)-o)))},Mm={tryUp:b(Lm,{point:e=>e.top,adjuster:(e,t,o,n,r)=>{const s=Rm(r,5);return Math.abs(o.top-n.top)<1||o.bottome.getSelection().bind(n=>((e,t,o,n)=>{const r=xm(t)?((e,t,o)=>o.traverse(t).orThunk(()=>Cm(t,o.gather,e)).map(o.relative))(e,t,n):Tm(e,t,o,n);return r.map(e=>({start:e,finish:e}))})(t,n.finish,n.foffset,o).fold(()=>C.some(Wl(n.finish,n.foffset)),r=>{const s=e.fromSitus(r);return l=ym.verify(e,n.finish,n.foffset,s.finish,s.foffset,o.failure,t),ym.cata(l,e=>C.none(),()=>C.none(),e=>C.some(Wl(e,0)),e=>C.some(Wl(e,yn(e))));var l})),jm=(e,t,o,n,r,s)=>0===s?C.none():Fm(e,t,o,n,r).bind(l=>{const a=e.fromSitus(l),c=ym.verify(e,o,n,a.finish,a.foffset,r.failure,t);return ym.cata(c,()=>C.none(),()=>C.some(l),l=>Je(o,l)&&0===n?Pm(e,o,n,Rm,r):jm(e,t,l,0,r,s-1),l=>Je(o,l)&&n===yn(l)?Pm(e,o,n,Sm,r):jm(e,t,l,yn(l),r,s-1))}),Pm=(e,t,o,n,r)=>Em(e,t,o).bind(t=>Im(e,r,n(t,Mm.getJumpSize()))),Im=(e,t,o)=>{const n=kt().browser;return n.isChromium()||n.isSafari()||n.isFirefox()?t.retry(e,o):C.none()},Fm=(e,t,o,n,r)=>Em(e,o,n).bind(t=>Im(e,r,t)),Hm=(e,t,o,n,r)=>an(n,"td,th",t).bind(n=>an(n,"table",t).bind(s=>((e,t)=>on(e,e=>$t(e).exists(e=>Je(e,t)),void 0).isSome())(r,s)?((e,t,o)=>Wm(e,t,o).bind(n=>jm(e,t,n.element,n.offset,o,20).map(e.fromSitus)))(e,t,o).bind(e=>an(e.finish,"td,th",t).map(t=>({start:n,finish:t,range:e}))):C.none())),$m=(e,t,o,n,r,s)=>s(n,t).orThunk(()=>Hm(e,t,o,n,r).map(e=>{const t=e.range;return mm(C.some(pm(t.start,t.soffset,t.finish,t.foffset)),!0)})),Vm=(e,t)=>an(e,"tr",t).bind(e=>an(e,"table",t).bind(o=>{const n=vn(o,"tr");return Je(e,n[0])?((e,t,o)=>Vl(Ul,e,e=>Sn(e).isSome(),o))(o,0,t).map(e=>{const t=yn(e);return mm(C.some(pm(e,t,e,t)),!0)}):C.none()})),qm=(e,t)=>an(e,"tr",t).bind(e=>an(e,"table",t).bind(o=>{const n=vn(o,"tr");return Je(e,n[n.length-1])?((e,t,o)=>ql(Ul,e,e=>Tn(e).isSome(),o))(o,0,t).map(e=>mm(C.some(pm(e,0,e,0)),!0)):C.none()})),Um=(e,t,o,n,r,s,l)=>Hm(e,o,n,r,s).bind(e=>bm(t,o,e.start,e.finish,l)),Gm=(e,t)=>an(e,"td,th",t),Km=e=>Vt(e).exists(gn),Ym={traverse:Gt,gather:Kl,relative:kn.before,retry:Mm.tryDown,failure:ym.failedDown},Jm={traverse:Ut,gather:Gl,relative:kn.before,retry:Mm.tryUp,failure:ym.failedUp},Qm=e=>t=>t===e,Xm=Qm(38),Zm=Qm(40),ed=e=>e>=37&&e<=40,td={isBackward:Qm(37),isForward:Qm(39)},od={isBackward:Qm(39),isForward:Qm(37)},nd=e=>({elementFromPoint:(t,o)=>Me.fromPoint(Me.fromDom(e.document),t,o),getRect:e=>e.dom.getBoundingClientRect(),getRangedRect:(t,o,n,r)=>{const s=_n.exact(t,o,n,r);return((e,t)=>(e=>{const t=e.getClientRects(),o=t.length>0?t[0]:e.getBoundingClientRect();return o.width>0||o.height>0?C.some(o).map(He):C.none()})(Ue(e,t)))(e,s)},getSelection:()=>Fn(e).map(t=>hm(e,t)),fromSitus:t=>{const o=_n.relative(t.start,t.finish);return hm(e,o)},situsFromPoint:(t,o)=>Hn(e,t,o).map(e=>gm(e.start,e.soffset,e.finish,e.foffset)),clearSelection:()=>{(e=>{Bn(e).each(e=>e.removeAllRanges())})(e)},collapseSelection:(t=!1)=>{Fn(e).each(o=>o.fold(e=>e.collapse(t),(o,n)=>{const r=t?o:n;Wn(e,r,r)},(o,n,r,s)=>{const l=t?o:r,a=t?n:s;Mn(e,l,a,l,a)}))},setSelection:t=>{Mn(e,t.start,t.soffset,t.finish,t.foffset)},setRelativeSelection:(t,o)=>{Wn(e,t,o)},selectNode:t=>{In(e,t,!1)},selectContents:t=>{In(e,t)},getInnerHeight:()=>e.innerHeight,getScrollY:()=>(e=>{const t=void 0!==e?e.dom:document,o=t.body.scrollLeft||t.documentElement.scrollLeft,n=t.body.scrollTop||t.documentElement.scrollTop;return qo(o,n)})(Me.fromDom(e.document)).top,scrollBy:(t,o)=>{((e,t,o)=>{const n=(void 0!==o?o.dom:document).defaultView;n&&n.scrollBy(e,t)})(t,o,Me.fromDom(e.document))}}),rd=(e,t)=>({rows:e,cols:t}),sd=e=>nn(e,Lt).exists(gn),ld=(e,t)=>sd(e)||sd(t),ad="data-mce-selected",cd="data-mce-first-selected",id="data-mce-last-selected",md="["+ad+"]",dd={selected:ad,selectedSelector:"td["+ad+"],th["+ad+"]",firstSelected:cd,firstSelectedSelector:"td["+cd+"],th["+cd+"]",lastSelected:id,lastSelectedSelector:"td["+id+"],th["+id+"]"},ud=(e,t,o)=>({element:o,mergable:im(t,e,dd),unmergable:cm(e),selection:am(e)}),fd=e=>(t,o)=>{const n=Nt(t),r="col"===n||"colgroup"===n?ir(s=t).bind(e=>sm(e,dd.firstSelectedSelector)).fold(g(s),e=>e[0]):t;var s;return an(r,e,o)},gd=fd("th,td,caption"),hd=fd("th,td"),pd=e=>{return t=e.model.table.getSelectedCells(),E(t,Me.fromDom);var t},bd=(e,t)=>{e.on("BeforeGetContent",t=>{const o=o=>{t.preventDefault(),(e=>ir(e[0]).map(e=>{const t=((e,t)=>{const o=e=>Ge(e.element,t),n=So(e),r=vr(n),s=As(e),l=Or(r),a=((e,t)=>{const o=e.grid.columns;let n=e.grid.rows,r=o,s=0,l=0;const a=[],c=[];return G(e.access,e=>{if(a.push(e),t(e)){c.push(e);const t=e.row,o=t+e.rowspan-1,a=e.column,i=a+e.colspan-1;ts&&(s=o),al&&(l=i)}}),((e,t,o,n,r,s)=>({minRow:e,minCol:t,maxRow:o,maxCol:n,allCells:r,selectedCells:s}))(n,r,s,l,a,c)})(l,o),c="th:not("+t+"),td:not("+t+")",i=sr(n,"th,td",e=>Ge(e,c));_(i,yo),((e,t,o,n)=>{const r=B(e,e=>"colgroup"!==e.section),s=t.grid.columns,l=t.grid.rows;for(let e=0;eo.maxRow||ao.maxCol||(kr(t,e,a).filter(n).isNone()?al(r,l,e):l=!0)}})(r,l,a,o);const m=((e,t,o,n)=>{if(0===n.minCol&&t.grid.columns===n.maxCol+1)return 0;const r=Es(t,e,o),s=A(r,(e,t)=>e+t,0),l=A(r.slice(n.minCol,n.maxCol+1),(e,t)=>e+t,0),a=l/s*o.pixelWidth()-o.pixelWidth();return o.getCellDelta(a)})(e,Dr(e),s,a);return((e,t,o,n)=>{G(o.columns,e=>{(e.columnt.maxCol)&&yo(e.element)});const r=B(rr(e,"tr"),e=>0===e.dom.childElementCount);_(r,yo),t.minCol!==t.maxCol&&t.minRow!==t.maxRow||_(rr(e,"th,td"),e=>{bo(e,"rowspan"),bo(e,"colspan")}),bo(e,yr),bo(e,"data-snooker-col-series"),As(e).adjustTableWidth(n)})(n,a,l,m),n})(e,md);return qi(t),[t]}))(o).each(o=>{const n="text"===t.format?((e,t)=>{const o=e.getDoc(),n=Qt(Me.fromDom(e.getBody())),r=Me.fromTag("div",o);fo(r,"data-mce-bogus","all"),_o(r,{position:"fixed",left:"-9999999px",top:"0",overflow:"hidden",opacity:"0"});const s=(e=>Jt(e)?e:Me.fromDom(Ht(e).dom.body))(n);mo(r,t),ao(s,r);const l=r.dom.innerText;return yo(r),l})(e,o):((e,t)=>E(t,t=>e.selection.serializer.serialize(t.dom,{})).join(""))(e,o);t.content=n})};if(!0===t.selection){const t=(e=>B(pd(e),e=>Ge(e,dd.selectedSelector)))(e);t.length>=1&&o(t)}}),e.on("BeforeSetContent",o=>{if(!0===o.selection&&!0===o.paste){const n=pd(e);H(n).each(n=>{ir(n).each(r=>{const s=B((e=>{const t=document.createElement("div");return t.innerHTML=e,Kt(Me.fromDom(t))})(o.content),e=>"meta"!==Nt(e)),l=It("table");if(ji(e)&&1===s.length&&l(s[0])){o.preventDefault();const l=Me.fromDom(e.getDoc()),a=pa(l),c=((e,t,o)=>({element:e,clipboard:t,generators:o}))(n,s[0],a);t.pasteCells(r,c).each(()=>{e.focus()})}})})}})},wd=(e,t)=>e.dispatch("NewRow",{node:t}),vd=(e,t)=>e.dispatch("NewCell",{node:t}),yd=(e,t,o)=>{e.dispatch("TableModified",{...o,table:t})},xd={structure:!1,style:!0},Cd={structure:!0,style:!1},Td={structure:!0,style:!0},Sd=(e,t)=>zi(e)?Ms(t):Ai(e)?Ls(t):As(t),Rd=(e,t,o)=>{const n=e=>"table"===Nt($i(e)),r=Oi(e),s=Ni(e)?f:rl,l=t=>{switch(ki(e)){case"section":return Ir();case"sectionCells":return Fr();case"cells":return Hr();default:return((e,t)=>{var o;switch((o=Dr(e),V(o.all,e=>{const t=hr(e);return"header"===t.type?C.from(t.subType):C.none()})).getOr(t)){case"section":return Wr();case"sectionCells":return jr();case"cells":return Pr()}})(t,"section")}},a=(n,s,a,c)=>(i,m,d=!1)=>{qi(i);const u=Me.fromDom(e.getDoc()),f=ha(a,u,r),g={sizing:Sd(e,i),resize:Ni(e)?Jn():Qn(),section:l(i)};return s(i)?n(i,m,f,g).bind(n=>{t.refresh(i.dom),_(n.newRows,t=>{wd(e,t.dom)}),_(n.newCells,t=>{vd(e,t.dom)});const r=((t,n)=>n.cursor.fold(()=>{const n=ar(t);return H(n).filter(Oo).map(n=>{o.clearSelectedCells(t.dom);const r=e.dom.createRng();return r.selectNode(n.dom),e.selection.setRng(r),fo(n,"data-mce-selected","1"),r})},n=>{const r=Fl(Hl,n),s=e.dom.createRng();return s.setStart(r.element.dom,r.offset),s.setEnd(r.element.dom,r.offset),e.selection.setRng(s),o.clearSelectedCells(t.dom),C.some(s)}))(i,n);return Oo(i)&&(qi(i),d||yd(e,i.dom,c)),r.map(e=>({rng:e,effect:c}))}):C.none()},c=a(Oc,t=>!n(e)||ba(t).rows>1,f,Cd),i=a(Dc,t=>!n(e)||ba(t).columns>1,f,Cd);return{deleteRow:c,deleteColumn:i,insertRowsBefore:a(Cc,x,f,Cd),insertRowsAfter:a(Tc,x,f,Cd),insertColumnsBefore:a(Sc,x,s,Cd),insertColumnsAfter:a(Rc,x,s,Cd),mergeCells:a(Lc,x,f,Cd),unmergeCells:a(Mc,x,f,Cd),pasteColsBefore:a(jc,x,f,Cd),pasteColsAfter:a(Pc,x,f,Cd),pasteRowsBefore:a(Ic,x,f,Cd),pasteRowsAfter:a(Fc,x,f,Cd),pasteCells:a(Wc,x,f,Td),makeCellsHeader:a(zc,x,f,Cd),unmakeCellsHeader:a(Ac,x,f,Cd),makeColumnsHeader:a(kc,x,f,Cd),unmakeColumnsHeader:a(Ec,x,f,Cd),makeRowsHeader:a(_c,x,f,Cd),makeRowsBody:a(Nc,x,f,Cd),makeRowsFooter:a(Bc,x,f,Cd),getTableRowType:Vc,getTableCellType:$c,getTableColType:Hc}},Dd=(e,t)=>{e.selection.select(t.dom,!0),e.selection.collapse(!0)},Od=(e,t,o,n,s)=>{const l=(e=>{const t=e.options,o=t.get("table_default_styles");return t.isSet("table_default_styles")?o:((e,t)=>Li(e)||!Wi(e)?t:Ai(e)?{...t,width:Di(e)}:{...t,width:Ri})(e,o)})(e),a={styles:l,attributes:Fi(e),colGroups:Hi(e)};return e.undoManager.ignore(()=>{const r=((e,t,o,n,r,s=Zc)=>{const l=Me.fromTag("table"),a="cells"!==r;_o(l,s.styles),go(l,s.attributes),s.colGroups&&ao(l,(e=>{const t=Me.fromTag("colgroup");return k(e,()=>ao(t,Me.fromTag("col"))),t})(t));const c=Math.min(e,o);if(a&&o>0){const e=Me.fromTag("thead");ao(l,e);const s=oi(o,t,"sectionCells"===r?c:0,n);mo(e,s)}const i=Me.fromTag("tbody");ao(l,i);const m=oi(a?e-c:e,t,a?0:o,n);return mo(i,m),l})(o,t,s,n,ki(e),a);fo(r,"data-mce-id","__mce");const l=(e=>{const t=Me.fromTag("div"),o=Me.fromDom(e.dom.cloneNode(!0));return ao(t,o),(e=>e.dom.innerHTML)(t)})(r);e.insertContent(l),e.addVisual()}),ln($i(e),'table[data-mce-id="__mce"]').map(t=>(Ai(e)?la(t):Li(e)?aa(t):(zi(e)||(e=>r(e)&&-1!==e.indexOf("%"))(l.width))&&sa(t),qi(t),bo(t,"data-mce-id"),((e,t)=>{_(vn(t,"tr"),t=>{wd(e,t.dom),_(vn(t,"th,td"),t=>{vd(e,t.dom)})})})(e,t),((e,t)=>{ln(t,"td,th").each(b(Dd,e))})(e,t),t.dom)).getOrNull()};var kd=tinymce.util.Tools.resolve("tinymce.FakeClipboard");const Ed="x-tinymce/dom-table-",_d=Ed+"rows",Nd=Ed+"columns",Bd=e=>{const t=kd.FakeClipboardItem(e);kd.write([t])},zd=e=>{const t=kd.read()??[];return V(t,t=>C.from(t.getType(e)))},Ad=e=>{zd(e).isSome()&&kd.clear()},Ld=e=>{e.fold(Wd,e=>Bd({[_d]:e}))},Md=()=>zd(_d),Wd=()=>Ad(_d),jd=e=>{e.fold(Id,e=>Bd({[Nd]:e}))},Pd=()=>zd(Nd),Id=()=>Ad(Nd),Fd=e=>gd(Ui(e),Vi(e)).filter(Zi),Hd=(e,t)=>{const o=Vi(e),n=e=>ir(e,o),l=t=>(e=>hd(Ui(e),Vi(e)).filter(Zi))(e).bind(e=>n(e).map(o=>t(o,e))),a=t=>{e.focus()},c=(t,o=!1)=>l((n,r)=>{const s=ud(pd(e),n,r);t(n,s,o).each(a)}),i=()=>l((t,o)=>((e,t,o)=>{const n=Dr(e);return Ys(n,t).bind(e=>{const t=Hs(n,o,!1),r=ze(t).rows.slice(e[0].row,e[e.length-1].row+e[e.length-1].rowspan),s=j(r,e=>{const t=B(e.cells,e=>!e.isLocked);return t.length>0?[{...e,cells:t}]:[]}),l=$s(s);return de(l.length>0,l)}).map(e=>E(e,e=>{const t=To(e.element);return _(e.cells,e=>{const o=So(e.element);Ws(o,"colspan",e.colspan,1),Ws(o,"rowspan",e.rowspan,1),ao(t,o)}),t}))})(t,ud(pd(e),t,o),ha(f,Me.fromDom(e.getDoc()),C.none()))),m=()=>l((t,o)=>((e,t)=>{const o=Dr(e);return Js(o,t).map(e=>{const t=e[e.length-1],n=e[0].column,r=t.column+t.colspan,s=((e,t,o)=>{if(zr(e)){const n=B(Br(e),ll(t,o)),r=E(n,e=>{const n=So(e.element);return sl(n,"span",o-t),n}),s=Me.fromTag("colgroup");return mo(s,r),[s]}return[]})(o,n,r),l=((e,t,o)=>E(e.all,e=>{const n=B(e.cells,ll(t,o)),r=E(n,e=>{const n=So(e.element);return sl(n,"colspan",o-t),n}),s=Me.fromTag("tr");return mo(s,r),s}))(o,n,r);return[...s,...l]})})(t,ud(pd(e),t,o))),d=(t,o)=>o().each(o=>{const n=E(o,e=>So(e));l((o,r)=>{const s=pa(Me.fromDom(e.getDoc())),l=((e,t,o,n)=>({selection:am(e),clipboard:o,generators:n}))(pd(e),0,n,s);t(o,l).each(a)})}),g=e=>(t,o)=>((e,t)=>X(e,t)?C.from(e[t]):C.none())(o,"type").each(t=>{c(e(t),o.no_events)});G({mceTableSplitCells:()=>c(t.unmergeCells),mceTableMergeCells:()=>c(t.mergeCells),mceTableInsertRowBefore:()=>c(t.insertRowsBefore),mceTableInsertRowAfter:()=>c(t.insertRowsAfter),mceTableInsertColBefore:()=>c(t.insertColumnsBefore),mceTableInsertColAfter:()=>c(t.insertColumnsAfter),mceTableDeleteCol:()=>c(t.deleteColumn),mceTableDeleteRow:()=>c(t.deleteRow),mceTableCutCol:()=>m().each(e=>{jd(e),c(t.deleteColumn)}),mceTableCutRow:()=>i().each(e=>{Ld(e),c(t.deleteRow)}),mceTableCopyCol:()=>m().each(e=>jd(e)),mceTableCopyRow:()=>i().each(e=>Ld(e)),mceTablePasteColBefore:()=>d(t.pasteColsBefore,Pd),mceTablePasteColAfter:()=>d(t.pasteColsAfter,Pd),mceTablePasteRowBefore:()=>d(t.pasteRowsBefore,Md),mceTablePasteRowAfter:()=>d(t.pasteRowsAfter,Md),mceTableDelete:()=>Fd(e).each(t=>{ir(t,o).filter(w(o)).each(t=>{const o=Me.fromText("");if(so(t,o),yo(t),e.dom.isEmpty(e.getBody()))e.setContent(""),e.selection.setCursorLocation();else{const t=e.dom.createRng();t.setStart(o.dom,0),t.setEnd(o.dom,0),e.selection.setRng(t),e.nodeChanged()}})}),mceTableCellToggleClass:(t,o)=>{l(t=>{const n=pd(e),r=P(n,t=>e.formatter.match("tablecellclass",{value:o},t.dom)),s=r?e.formatter.remove:e.formatter.apply;_(n,e=>s("tablecellclass",{value:o},e.dom)),yd(e,t.dom,xd)})},mceTableToggleClass:(t,o)=>{l(t=>{e.formatter.toggle("tableclass",{value:o},t.dom),yd(e,t.dom,xd)})},mceTableToggleCaption:()=>{Fd(e).each(t=>{ir(t,o).each(o=>{sn(o,"caption").fold(()=>{const t=Me.fromTag("caption");ao(t,Me.fromText("Caption")),((e,t)=>{Yt(e,0).fold(()=>{ao(e,t)},e=>{ro(e,t)})})(o,t),e.selection.setCursorLocation(t.dom,0)},n=>{It("caption")(t)&&Ye("td",o).each(t=>e.selection.setCursorLocation(t.dom,0)),yo(n)}),yd(e,o.dom,Cd)})})},mceTableSizingMode:(t,n)=>(t=>Fd(e).each(n=>{Li(e)||Ai(e)||zi(e)||ir(n,o).each(o=>{"relative"!==t||Rl(o)?"fixed"!==t||Dl(o)?"responsive"!==t||Ol(o)||aa(o):la(o):sa(o),qi(o),yd(e,o.dom,Cd)})}))(n),mceTableCellType:g(e=>"th"===e?t.makeCellsHeader:t.unmakeCellsHeader),mceTableColType:g(e=>"th"===e?t.makeColumnsHeader:t.unmakeColumnsHeader),mceTableRowType:g(e=>{switch(e){case"header":return t.makeRowsHeader;case"footer":return t.makeRowsFooter;default:return t.makeRowsBody}})},(t,o)=>e.addCommand(o,t)),e.addCommand("mceInsertTable",(t,o)=>{((e,t,o,n={})=>{const r=e=>u(e)&&e>0;if(r(t)&&r(o)){const r=n.headerRows??Pi(e),s=n.headerColumns??Ii(e);return Od(e,o,t,s,r)}console.error("Invalid values for mceInsertTable - rows and columns values are required to insert a table.")})(e,o.rows,o.columns,o.options)}),e.addCommand("mceTableApplyCellStyle",(t,o)=>{const l=e=>"tablecell"+e.toLowerCase().replace("-","");if(!s(o))return;const a=B(pd(e),Zi);if(0===a.length)return;const c=((e,t)=>{const o={};return((e,t,o,n)=>{G(e,(e,r)=>{(t(e,r)?o:n)(e,r)})})(e,t,(e=>(t,o)=>{e[o]=t})(o),f),o})(o,(t,o)=>e.formatter.has(l(o))&&r(t));(e=>{for(const t in e)if(U.call(e,t))return!1;return!0})(c)||(G(c,(t,o)=>{const n=l(o);_(a,o=>{""===t?e.formatter.remove(n,{value:null},o.dom,!0):e.formatter.apply(n,{value:t},o.dom)})}),n(a[0]).each(t=>yd(e,t.dom,xd)))})},$d=e=>!un(Me.fromDom(e.target),"ephox-snooker-resizer-bar"),Vd=(e,t)=>{const o=(r=dd.selectedSelector,{get:()=>sm(Me.fromDom(e.getBody()),r).fold(()=>hd(Ui(e),Vi(e)).fold(dm,fm),um)}),n=((e,t,o)=>{const n=t=>{bo(t,e.selected),bo(t,e.firstSelected),bo(t,e.lastSelected)},r=t=>{fo(t,e.selected,"1")},s=e=>{l(e),o()},l=t=>{const o=vn(t,`${e.selectedSelector},${e.firstSelectedSelector},${e.lastSelectedSelector}`);_(o,n)};return{clearBeforeUpdate:l,clear:s,selectRange:(o,n,l,a)=>{s(o),_(n,r),fo(l,e.firstSelected,"1"),fo(a,e.lastSelected,"1"),t(n,l,a)},selectedSelector:e.selectedSelector,firstSelectedSelector:e.firstSelectedSelector,lastSelectedSelector:e.lastSelectedSelector}})(dd,(t,o,n)=>{ir(o).each(r=>{const s=E(t,e=>e.dom),l=Oi(e),a=ha(f,Me.fromDom(e.getDoc()),l),c=((e,t,o)=>{const n=Dr(e);return Ys(n,t).map(e=>{const t=Hs(n,o,!1),{rows:r}=ze(t),s=((e,t)=>{const o=e.slice(0,t[t.length-1].row+1),n=$s(o);return j(n,e=>{const o=e.cells.slice(0,t[t.length-1].column+1);return E(o,e=>e.element)})})(r,e),l=((e,t)=>{const o=e.slice(t[0].row+t[0].rowspan-1,e.length),n=$s(o);return j(n,e=>{const o=e.cells.slice(t[0].column+t[0].colspan-1,e.cells.length);return E(o,e=>e.element)})})(r,e);return{upOrLeftCells:s,downOrRightCells:l}})})(r,{selection:pd(e)},a).map(e=>K(e,e=>E(e,e=>e.dom))).getOrUndefined();((e,t,o,n,r)=>{e.dispatch("TableSelectionChange",{cells:t,start:o,finish:n,otherCells:r})})(e,s,o.dom,n.dom,c)})},()=>(e=>{e.dispatch("TableSelectionClear")})(e));var r;return e.on("init",o=>{const r=e.getWin(),s=$i(e),l=Vi(e),a=((e,t,o,n)=>{const r=((e,t,o,n)=>{const r=fe(),s=r.clear,l=s=>{r.on(r=>{n.clearBeforeUpdate(t),Gm(s.target,o).each(l=>{tm(r,l,o).each(o=>{const r=o.boxes.getOr([]);if(1===r.length){const e=r[0],o="false"===hn(e),l=ie(fn(s.target),e,Je);o&&l&&n.selectRange(t,r,e,e)}else r.length>1&&(n.selectRange(t,r,o.start,o.finish),e.selectContents(l))})})})};return{clearstate:s,mousedown:e=>{n.clear(t),Gm(e.target,o).filter(Km).each(r.set)},mouseover:e=>{l(e)},mouseup:e=>{l(e),s()}}})(nd(e),t,o,n);return{clearstate:r.clearstate,mousedown:r.mousedown,mouseover:r.mouseover,mouseup:r.mouseup}})(r,s,l,n),c=((e,t,o,n)=>{const r=nd(e),s=()=>(n.clear(t),C.none());return{keydown:(e,l,a,c,i,m)=>{const d=e.raw,u=d.which,f=!0===d.shiftKey,g=om(t,n.selectedSelector).fold(()=>(ed(u)&&!f&&n.clearBeforeUpdate(t),ed(u)&&f&&!ld(l,c)?C.none:Zm(u)&&f?b(Um,r,t,o,Ym,c,l,n.selectRange):Xm(u)&&f?b(Um,r,t,o,Jm,c,l,n.selectRange):Zm(u)?b($m,r,o,Ym,c,l,qm):Xm(u)?b($m,r,o,Jm,c,l,Vm):C.none),e=>{const o=o=>()=>{const s=V(o,o=>((e,t,o,n,r)=>rm(n,e,t,r.firstSelectedSelector,r.lastSelectedSelector).map(e=>(r.clearBeforeUpdate(o),r.selectRange(o,e.boxes,e.start,e.finish),e.boxes)))(o.rows,o.cols,t,e,n));return s.fold(()=>nm(t,n.firstSelectedSelector,n.lastSelectedSelector).map(e=>{const o=Zm(u)||m.isForward(u)?kn.after:kn.before;return r.setRelativeSelection(kn.on(e.first,0),o(e.table)),n.clear(t),mm(C.none(),!0)}),e=>C.some(mm(C.none(),!0)))};return ed(u)&&f&&!ld(l,c)?C.none:Zm(u)&&f?o([rd(1,0)]):Xm(u)&&f?o([rd(-1,0)]):m.isBackward(u)&&f?o([rd(0,-1),rd(-1,0)]):m.isForward(u)&&f?o([rd(0,1),rd(1,0)]):ed(u)&&!f?s:C.none});return g()},keyup:(e,r,s,l,a)=>om(t,n.selectedSelector).fold(()=>{const c=e.raw,i=c.which;return!0===c.shiftKey&&ed(i)&&ld(r,l)?((e,t,o,n,r,s,l)=>Je(o,r)&&n===s?C.none():an(o,"td,th",t).bind(o=>an(r,"td,th",t).bind(n=>bm(e,t,o,n,l))))(t,o,r,s,l,a,n.selectRange):C.none()},C.none)}})(r,s,l,n),i=((e,t,o,n)=>{const r=nd(e);return(e,s)=>{n.clearBeforeUpdate(t),tm(e,s,o).each(e=>{const o=e.boxes.getOr([]);n.selectRange(t,o,e.start,e.finish),r.selectContents(s),r.collapseSelection()})}})(r,s,l,n);e.on("TableSelectorChange",e=>i(e.start,e.finish));const m=(t,o)=>{(e=>!0===e.raw.shiftKey)(t)&&(o.kill&&t.kill(),o.selection.each(t=>{const o=_n.relative(t.start,t.finish),n=Ue(r,o);e.selection.setRng(n)}))},d=e=>0===e.button,u=(()=>{const e=ee(Me.fromDom(s)),t=ee(0);return{touchEnd:o=>{const n=Me.fromDom(o.target);if(It("td")(n)||It("th")(n)){const r=e.get(),s=t.get();Je(r,n)&&o.timeStamp-s<300&&(o.preventDefault(),i(n,n))}e.set(n),t.set(o.timeStamp)}}})();e.on("dragstart",e=>{a.clearstate()}),e.on("mousedown",e=>{d(e)&&$d(e)&&a.mousedown(no(e))}),e.on("mouseover",e=>{var t;(void 0===(t=e).buttons||1&t.buttons)&&$d(e)&&a.mouseover(no(e))}),e.on("mouseup",e=>{d(e)&&$d(e)&&a.mouseup(no(e))}),e.on("touchend",u.touchEnd),e.on("keyup",t=>{const o=no(t);if(o.raw.shiftKey&&ed(o.raw.which)){const t=e.selection.getRng(),n=Me.fromDom(t.startContainer),r=Me.fromDom(t.endContainer);c.keyup(o,n,t.startOffset,r,t.endOffset).each(e=>{m(o,e)})}}),e.on("keydown",o=>{const n=no(o);t.hide();const r=e.selection.getRng(),s=Me.fromDom(r.startContainer),l=Me.fromDom(r.endContainer),a=Zo(td,od)(Me.fromDom(e.selection.getStart()));c.keydown(n,s,r.startOffset,l,r.endOffset,a).each(e=>{m(n,e)}),t.show()}),e.on("NodeChange",()=>{const t=e.selection,o=Me.fromDom(t.getStart()),r=Me.fromDom(t.getEnd());Zl(ir,[o,r]).fold(()=>n.clear(s),f)})}),e.on("PreInit",()=>{e.serializer.addTempAttr(dd.firstSelected),e.serializer.addTempAttr(dd.lastSelected)}),{getSelectedCells:()=>((e,t)=>{switch(e.tag){case"none":return t();case"single":return(e=>[e.dom])(e.element);case"multiple":return(e=>E(e,e=>e.dom))(e.elements)}})(o.get(),g([])),clearSelectedCells:e=>n.clear(Me.fromDom(e))}},qd=e=>m(e)&&"TABLE"===e.nodeName,Ud="bar-",Gd=e=>"false"!==ho(e,"data-mce-resize"),Kd=e=>{const t=fe(),o=fe();let n,r,s,l;const a=t=>Sd(e,t),c=()=>_i(e)?Qn():Jn(),i=(t,o,i,m)=>{const d=(e=>{return pe(t=e,"corner-")?(e=>e.substring(7))(t):t;var t})(o),u=be(d,"e"),f=pe(d,"n");if(""===r&&sa(t),""===l&&(e=>{const t=(e=>jo(e)+"px")(e);Sl(e,C.none(),C.some(t)),ra(e)})(t),i!==n&&""!==r){Eo(t,"width",r);const o=c(),s=a(t),l=_i(e)||u?(e=>ba(e).columns)(t)-1:0;ol(t,i-n,l,o,s)}else if((e=>/^(\d+(\.\d+)?)%$/.test(e))(r)){const e=parseFloat(r.replace("%",""));Eo(t,"width",i*e/n+"%")}if((e=>/^(\d+(\.\d+)?)px$/.test(e))(r)&&(e=>{const t=Dr(e);zr(t)||_(ar(e),e=>{const t=No(e,"width");Eo(e,"width",t),bo(e,"width")})})(t),m!==s&&""!==l){Eo(t,"height",l);const e=f?0:(e=>ba(e).rows)(t)-1;nl(t,m-s,e)}};e.on("init",()=>{const n=((e,t)=>((e,t)=>({parent:g(e),view:g(e),dragContainer:g(e),origin:()=>Go(e),isResizable:t}))(Me.fromDom(e.getBody()),t))(e,Gd);if(o.set(n),(e=>{const t=e.options.get("object_resizing");return D(t.split(","),"table")})(e)&&Mi(e)){const o=((e,t,o)=>{const n=ns,r=ss,s=Ti(e),l=ri({beforeResize:ni(["table","type"]),afterResize:ni(["table","type"]),startDrag:ni([])});return s.events.adjustHeight.bind(e=>{const t=e.table;l.trigger.beforeResize(t,"row");const o=n.delta(e.delta,t);nl(t,o,e.row),l.trigger.afterResize(t,"row")}),s.events.startAdjust.bind(e=>{l.trigger.startDrag()}),s.events.adjustWidth.bind(e=>{const n=e.table;l.trigger.beforeResize(n,"col");const s=r.delta(e.delta,n),a=o(n);ol(n,s,e.column,t,a),l.trigger.afterResize(n,"col")}),{on:s.on,off:s.off,refreshBars:s.refresh,hideBars:s.hideBars,showBars:s.showBars,destroy:s.destroy,events:l.registry}})(n,c(),a);e.mode.isReadOnly()||o.on(),o.events.beforeResize.bind(t=>{const o=t.table.dom;((e,t,o,n,r)=>{e.dispatch("ObjectResizeStart",{target:t,width:o,height:n,origin:r})})(e,o,Gi(o),Ki(o),Ud+t.type)}),o.events.afterResize.bind(t=>{const o=t.table,n=o.dom;qi(o),((e,t,o,n,r)=>{e.dispatch("ObjectResized",{target:t,width:o,height:n,origin:r})})(e,n,Gi(n),Ki(n),Ud+t.type),e.undoManager.add()}),t.set(o)}}),e.on("ObjectResizeStart",t=>{const o=t.target;if(qd(o)&&!e.mode.isReadOnly()){const a=Me.fromDom(o);_(e.dom.select(".mce-clonedresizable"),t=>{e.dom.addClass(t,"mce-"+Ei(e)+"-columns")}),!Dl(a)&&Ai(e)?la(a):!Rl(a)&&zi(e)&&sa(a),Ol(a)&&pe(t.origin,Ud)&&sa(a),n=t.width,r=Li(e)?"":Qi(e,o).getOr(""),s=t.height,l=Xi(e,o).getOr("")}}),e.on("ObjectResized",t=>{const o=t.target;if(qd(o)){const n=Me.fromDom(o),r=t.origin;(e=>pe(e,"corner-"))(r)&&i(n,r,t.width,t.height),qi(n),yd(e,n.dom,xd)}});const m=()=>{t.on(e=>{e.on(),e.showBars()})},d=()=>{t.on(e=>{e.off(),e.hideBars()})};return e.on("DisabledStateChange",e=>{e.state?d():m()}),e.on("SwitchMode",()=>{e.mode.isReadOnly()?d():m()}),e.on("dragstart dragend",e=>{"dragstart"===e.type?d():m()}),e.on("remove",()=>{t.on(e=>{e.destroy()})}),{refresh:e=>{t.on(t=>t.refreshBars(Me.fromDom(e)))},hide:()=>{t.on(e=>e.hideBars())},show:()=>{t.on(e=>e.showBars())}}},Yd=e=>{(e=>{const t=e.options.register;t("table_clone_elements",{processor:"string[]"}),t("table_use_colgroups",{processor:"boolean",default:!0}),t("table_header_type",{processor:e=>{const t=D(["section","cells","sectionCells","auto"],e);return t?{value:e,valid:t}:{valid:!1,message:"Must be one of: section, cells, sectionCells or auto."}},default:"section"}),t("table_sizing_mode",{processor:"string",default:"auto"}),t("table_default_attributes",{processor:"object",default:{border:"1"}}),t("table_default_styles",{processor:"object",default:{"border-collapse":"collapse"}}),t("table_column_resizing",{processor:e=>{const t=D(["preservetable","resizetable"],e);return t?{value:e,valid:t}:{valid:!1,message:"Must be preservetable, or resizetable."}},default:"preservetable"}),t("table_resize_bars",{processor:"boolean",default:!0}),t("table_style_by_css",{processor:"boolean",default:!0}),t("table_merge_content_on_paste",{processor:"boolean",default:!0}),t("table_default_header_rows",{processor:"number",default:0}),t("table_default_header_cols",{processor:"number",default:0})})(e);const t=Kd(e),o=Vd(e,t),n=Rd(e,t,o);return Hd(e,n),((e,t)=>{const o=Vi(e),n=t=>hd(Ui(e)).bind(n=>ir(n,o).map(o=>{const r=ud(pd(e),o,n);return t(o,r)})).getOr("");G({mceTableRowType:()=>n(t.getTableRowType),mceTableCellType:()=>n(t.getTableCellType),mceTableColType:()=>n(t.getTableColType)},(t,o)=>e.addQueryValueHandler(o,t))})(e,n),bd(e,n),{getSelectedCells:o.getSelectedCells,clearSelectedCells:o.clearSelectedCells}};e.add("dom",e=>({table:Yd(e)}))}(); \ No newline at end of file diff --git a/public/assets/tinymce/notices.txt b/public/assets/tinymce/notices.txt index 2109267e8..63e7fe656 100644 --- a/public/assets/tinymce/notices.txt +++ b/public/assets/tinymce/notices.txt @@ -4,7 +4,7 @@ Below is a list of third party libraries that this software uses: dompurify owner: Mario Heiderich repo: https://github.com/cure53/DOMPurify -version: 3.2.6 +version: 3.3.2 license: MPL-2.0 OR Apache-2.0 prismjs diff --git a/public/assets/tinymce/package.json b/public/assets/tinymce/package.json index db91cfc8e..009a63468 100644 --- a/public/assets/tinymce/package.json +++ b/public/assets/tinymce/package.json @@ -1,6 +1,6 @@ { "name": "tinymce", - "version": "8.1.2", + "version": "8.10.0", "repository": { "type": "git", "url": "https://github.com/tinymce/tinymce.git", @@ -10,7 +10,7 @@ "author": "Ephox Corporation DBA Tiny Technologies, Inc", "main": "tinymce.js", "types": "tinymce.d.ts", - "license": "GPL-2.0-or-later", + "license": "SEE LICENSE IN license.md", "keywords": [ "wysiwyg", "tinymce", diff --git a/public/assets/tinymce/plugins/accordion/plugin.js b/public/assets/tinymce/plugins/accordion/plugin.js index abfd822b3..d65fe78bc 100644 --- a/public/assets/tinymce/plugins/accordion/plugin.js +++ b/public/assets/tinymce/plugins/accordion/plugin.js @@ -1,5 +1,5 @@ /** - * TinyMCE version 8.1.2 (TBD) + * TinyMCE version 8.10.0 (2026-10-14) */ (function () { @@ -9,13 +9,12 @@ /* eslint-disable @typescript-eslint/no-wrapper-object-types */ const hasProto = (v, constructor, predicate) => { - var _a; if (predicate(v, constructor.prototype)) { return true; } else { // String-based fallback time - return ((_a = v.constructor) === null || _a === void 0 ? void 0 : _a.name) === constructor.name; + return v.constructor?.name === constructor.name; } }; const typeOf = (x) => { @@ -70,6 +69,11 @@ * strict-null-checks */ class Optional { + tag; + value; + // Sneaky optimisation: every instance of Optional.none is identical, so just + // reuse the same object + static singletonNone = new Optional(false); // The internal representation has a `tag` and a `value`, but both are // private: able to be console.logged, but not able to be accessed by code constructor(tag, value) { @@ -237,7 +241,7 @@ */ getOrDie(message) { if (!this.tag) { - throw new Error(message !== null && message !== void 0 ? message : 'Called getOrDie on None'); + throw new Error(message ?? 'Called getOrDie on None'); } else { return this.value; @@ -301,9 +305,6 @@ return this.tag ? `some(${this.value})` : 'none()'; } } - // Sneaky optimisation: every instance of Optional.none is identical, so just - // reuse the same object - Optional.singletonNone = new Optional(false); const nativeIndexOf = Array.prototype.indexOf; const rawIndexOf = (ts, t) => nativeIndexOf.call(ts, t); @@ -1003,16 +1004,20 @@ const fireToggleAccordionEvent = (editor, element, state) => editor.dispatch('ToggledAccordion', { element, state }); const fireToggleAllAccordionsEvent = (editor, elements, state) => editor.dispatch('ToggledAllAccordions', { elements, state }); + const option = (name) => (editor) => editor.options.get(name); + const isDisabled = option('disabled'); + const accordionTag = 'details'; const accordionDetailsClass = 'mce-accordion'; const accordionSummaryClass = 'mce-accordion-summary'; const accordionBodyWrapperClass = 'mce-accordion-body'; const accordionBodyWrapperTag = 'div'; + const accordionReadonlyCompensationAttribute = 'data-mce-accordion-open'; var global$3 = tinymce.util.Tools.resolve('tinymce.util.Tools'); - const isSummary = (node) => (node === null || node === void 0 ? void 0 : node.nodeName) === 'SUMMARY'; - const isDetails = (node) => (node === null || node === void 0 ? void 0 : node.nodeName) === 'DETAILS'; + const isSummary = (node) => node?.nodeName === 'SUMMARY'; + const isDetails = (node) => node?.nodeName === 'DETAILS'; const isOpen = (details) => details.hasAttribute('open'); const isInSummary = (editor) => { const node = editor.selection.getNode(); @@ -1039,14 +1044,14 @@ editor.selection.setCursorLocation(paragraph, 0); }; const normalizeContent = (editor, accordion) => { - if (isSummary(accordion === null || accordion === void 0 ? void 0 : accordion.lastChild)) { + if (isSummary(accordion?.lastChild)) { const paragraph = createParagraph(editor); accordion.appendChild(paragraph); editor.selection.setCursorLocation(paragraph, 0); } }; const normalizeSummary = (editor, accordion) => { - if (!isSummary(accordion === null || accordion === void 0 ? void 0 : accordion.firstChild)) { + if (!isSummary(accordion?.firstChild)) { const summary = createSummary(editor); accordion.prepend(summary); editor.selection.setCursorLocation(summary, 0); @@ -1090,8 +1095,11 @@ }); }); }; - const toggleDetailsElement = (details, state) => { - const shouldOpen = state !== null && state !== void 0 ? state : !isOpen(details); + const toggleDetailsElement = (isReadonly, details, state) => { + const shouldOpen = state ?? !isOpen(details); + if (!isReadonly) { + details.setAttribute(accordionReadonlyCompensationAttribute, shouldOpen ? 'open' : 'closed'); + } if (shouldOpen) { details.setAttribute('open', 'open'); } @@ -1101,8 +1109,11 @@ return shouldOpen; }; const toggleAccordion = (editor, state) => { + if (isDisabled(editor)) { + return; + } getSelectedDetails(editor).each((details) => { - fireToggleAccordionEvent(editor, details, toggleDetailsElement(details, state)); + fireToggleAccordionEvent(editor, details, toggleDetailsElement(editor.readonly, details, state)); }); }; const removeAccordion = (editor) => { @@ -1126,7 +1137,7 @@ if (accordions.length === 0) { return; } - each$1(accordions, (accordion) => toggleDetailsElement(accordion, state !== null && state !== void 0 ? state : !isOpen(accordion))); + each$1(accordions, (accordion) => toggleDetailsElement(editor.readonly, accordion, state ?? !isOpen(accordion))); fireToggleAllAccordionsEvent(editor, accordions, state); }; @@ -1139,7 +1150,17 @@ var global$2 = tinymce.util.Tools.resolve('tinymce.html.Node'); - const getClassList = (node) => { var _a, _b; return (_b = (_a = node.attr('class')) === null || _a === void 0 ? void 0 : _a.split(' ')) !== null && _b !== void 0 ? _b : []; }; + const normalizeOpenAttribute = (node) => { + if (hasAttribute(node, 'open')) { + setAttribute(node, 'open', 'open'); + } + }; + const hasAttribute = (node, attribute) => node.attr(attribute) !== undefined; + const setAttribute = (node, attribute, value) => { + node.attr(attribute, value); + }; + + const getClassList = (node) => node.attr('class')?.split(' ') ?? []; const addClasses = (node, classes) => { const classListSet = new Set([...getClassList(node), ...classes]); const newClassList = Array.from(classListSet); @@ -1191,12 +1212,15 @@ // Purpose: // - add mce-accordion-summary class to summary node // - wrap details body in div and add mce-accordion-body class (TINY-9959 assists with Chrome selection issue) + // - Normalize accordion 'open' attribute value to open="open" parser.addNodeFilter(accordionTag, (nodes) => { // Using a traditional for loop here as we may have to iterate over many nodes and it is the most performant way of doing so for (let i = 0; i < nodes.length; i++) { const node = nodes[i]; + normalizeOpenAttribute(node); if (isAccordionDetailsNode(node)) { const accordionNode = node; + accordionNode.attr(accordionReadonlyCompensationAttribute, accordionNode.attr('open') === 'open' ? 'open' : 'closed'); const { summaryNode, wrapperNode, otherNodes } = getAccordionChildren(accordionNode); const hasSummaryNode = isNonNullable(summaryNode); const newSummaryNode = hasSummaryNode ? summaryNode : new global$2('summary', 1); @@ -1247,6 +1271,8 @@ const node = nodes[i]; if (isAccordionDetailsNode(node)) { const accordionNode = node; + accordionNode.attr('open', accordionNode.attr(accordionReadonlyCompensationAttribute) === 'open' ? 'open' : null); + accordionNode.attr(accordionReadonlyCompensationAttribute, null); const { summaryNode, wrapperNode } = getAccordionChildren(accordionNode); if (isNonNullable(summaryNode)) { removeClasses(summaryNode, summaryClassRemoveSet); @@ -1311,7 +1337,8 @@ editor.ui.registry.addToggleButton('accordiontoggle', { icon: 'accordion-toggle', tooltip: 'Toggle accordion', - onAction: () => editor.execCommand('ToggleAccordion') + onAction: () => editor.execCommand('ToggleAccordion'), + context: 'any', }); editor.ui.registry.addToggleButton('accordionremove', { icon: 'remove', @@ -1326,13 +1353,17 @@ }); }; + const PLUGIN_CODE = 'accordion'; var Plugin = () => { - global$4.add('accordion', (editor) => { + global$4.add(PLUGIN_CODE, (editor) => { register(editor); register$1(editor); setup$1(editor); setup$2(editor); setup(editor); + return { + getMetadata: () => ({ name: 'Accordion', type: 'opensource', slug: PLUGIN_CODE }) + }; }); }; diff --git a/public/assets/tinymce/plugins/accordion/plugin.min.js b/public/assets/tinymce/plugins/accordion/plugin.min.js index 3b919dd95..86a029800 100644 --- a/public/assets/tinymce/plugins/accordion/plugin.min.js +++ b/public/assets/tinymce/plugins/accordion/plugin.min.js @@ -1 +1 @@ -!function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager");const t=e=>t=>typeof t===e,o=e=>"string"===(e=>{const t=typeof e;return null===e?"null":"object"===t&&Array.isArray(e)?"array":"object"===t&&(o=n=e,(r=String).prototype.isPrototypeOf(o)||(null===(s=n.constructor)||void 0===s?void 0:s.name)===r.name)?"string":t;var o,n,r,s})(e),n=t("boolean"),r=e=>null==e,s=e=>!r(e),a=t("function"),i=t("number"),l=e=>()=>e,d=(e,t)=>e===t,c=l(!1);class m{constructor(e,t){this.tag=e,this.value=t}static some(e){return new m(!0,e)}static none(){return m.singletonNone}fold(e,t){return this.tag?t(this.value):e()}isSome(){return this.tag}isNone(){return!this.tag}map(e){return this.tag?m.some(e(this.value)):m.none()}bind(e){return this.tag?e(this.value):m.none()}exists(e){return this.tag&&e(this.value)}forall(e){return!this.tag||e(this.value)}filter(e){return!this.tag||e(this.value)?this:m.none()}getOr(e){return this.tag?this.value:e}or(e){return this.tag?this:e}getOrThunk(e){return this.tag?this.value:e()}orThunk(e){return this.tag?this:e()}getOrDie(e){if(this.tag)return this.value;throw new Error(null!=e?e:"Called getOrDie on None")}static from(e){return s(e)?m.some(e):m.none()}getOrNull(){return this.tag?this.value:null}getOrUndefined(){return this.value}each(e){this.tag&&e(this.value)}toArray(){return this.tag?[this.value]:[]}toString(){return this.tag?`some(${this.value})`:"none()"}}m.singletonNone=new m(!1);const u=Array.prototype.indexOf,g=(e,t)=>{return o=e,n=t,u.call(o,n)>-1;var o,n},p=(e,t)=>{const o=e.length,n=new Array(o);for(let r=0;r{for(let o=0,n=e.length;oe.replace(w,""));var w;const b=(e,t)=>({element:e,offset:t}),N=e=>{if(null==e)throw new Error("Node cannot be null or undefined");return{dom:e}},T={fromHtml:(e,t)=>{const o=(t||document).createElement("div");if(o.innerHTML=e,!o.hasChildNodes()||o.childNodes.length>1){const t="HTML does not have a single root node";throw console.error(t,e),new Error(t)}return N(o.childNodes[0])},fromTag:(e,t)=>{const o=(t||document).createElement(e);return N(o)},fromText:(e,t)=>{const o=(t||document).createTextNode(e);return N(o)},fromDom:N,fromPoint:(e,t,o)=>m.from(e.dom.elementFromPoint(t,o)).map(N)},A=(e,t)=>{const o=e.dom;if(1!==o.nodeType)return!1;{const e=o;if(void 0!==e.matches)return e.matches(t);if(void 0!==e.msMatchesSelector)return e.msMatchesSelector(t);if(void 0!==e.webkitMatchesSelector)return e.webkitMatchesSelector(t);if(void 0!==e.mozMatchesSelector)return e.mozMatchesSelector(t);throw new Error("Browser lacks native selectors")}},C=e=>1!==e.nodeType&&9!==e.nodeType&&11!==e.nodeType||0===e.childElementCount,S=A,x=e=>e.dom.nodeName.toLowerCase(),D=e=>e.dom.nodeType,E=e=>t=>D(t)===e,O=E(1),M=E(3),P=E(9),R=E(11),k=e=>m.from(e.dom.parentNode).map(T.fromDom),B=e=>m.from(e.dom.nextSibling).map(T.fromDom),L=e=>p(e.dom.childNodes,T.fromDom),$=e=>T.fromDom(e.dom.host),V=(e,t)=>{k(e).each((o=>{o.dom.insertBefore(t.dom,e.dom)}))},I=(e,t)=>{B(e).fold((()=>{k(e).each((e=>{j(e,t)}))}),(e=>{V(e,t)}))},j=(e,t)=>{e.dom.appendChild(t.dom)},q=(e,t)=>{h(t,((o,n)=>{const r=0===n?e:t[n-1];I(r,o)}))},H=(e,t,r)=>{if(!(o(r)||n(r)||i(r)))throw console.error("Invalid call to Attribute.set. Key ",t,":: Value ",r,":: Element ",e),new Error("Attribute value was not simple");e.setAttribute(t,r+"")},z=(e,t)=>{const o=e.dom.getAttribute(t);return null===o?void 0:o},F=(e,t)=>m.from(z(e,t)),K=(e,t)=>{e.dom.removeAttribute(t)},U=e=>{const t=e.dom;null!==t.parentNode&&t.parentNode.removeChild(t)},Y=e=>void 0!==e.style&&a(e.style.getPropertyValue),_=e=>{const t=M(e)?e.dom.parentNode:e.dom;if(null==t||null===t.ownerDocument)return!1;const o=t.ownerDocument;return(e=>{const t=(e=>T.fromDom(e.dom.getRootNode()))(e);return R(o=t)&&s(o.dom.host)?m.some(t):m.none();var o})(T.fromDom(t)).fold((()=>o.body.contains(t)),(n=_,r=$,e=>n(r(e))));var n,r},G=(e,t)=>Y(e)?e.style.getPropertyValue(t):"",J=(e=>{const t=t=>e(t)?m.from(t.dom.nodeValue):m.none();return{get:o=>{if(!e(o))throw new Error("Can only get text value of a text node");return t(o).getOr("")},getOption:t,set:(t,o)=>{if(!e(t))throw new Error("Can only set raw text value of a text node");t.dom.nodeValue=o}}})(M),Q=(e,t,o)=>{let n=e.dom;const r=a(o)?o:c;for(;n.parentNode;){n=n.parentNode;const e=T.fromDom(n);if(t(e))return m.some(e);if(r(e))break}return m.none()},W=(e,t,o)=>Q(e,(e=>A(e,t)),o),X=(e,t)=>((e,t)=>{const o=void 0===t?document:t.dom;return C(o)?m.none():m.from(o.querySelector(e)).map(T.fromDom)})(t,e),Z=(e,t)=>{let o=[];return h(L(e),(e=>{t(e)&&(o=o.concat([e])),o=o.concat(Z(e,t))})),o};var ee=["body","p","div","article","aside","figcaption","figure","footer","header","nav","section","ol","ul","li","table","thead","tbody","tfoot","caption","tr","td","th","h1","h2","h3","h4","h5","h6","blockquote","pre","address"];const te=(e,t,o)=>e.property().isText(t)&&0===e.property().getText(t).trim().length||e.property().isComment(t)?o(t).bind((t=>te(e,t,o).orThunk((()=>m.some(t))))):m.none(),oe=(e,t)=>e.property().isText(t)?e.property().getText(t).length:e.property().children(t).length,ne=(e,t)=>{const o=te(e,t,e.query().prevSibling).getOr(t);if(e.property().isText(o))return b(o,oe(e,o));const n=e.property().children(o);return n.length>0?ne(e,n[n.length-1]):b(o,oe(e,o))},re=ne,se={up:l({selector:W,closest:(e,t,o)=>((e,t,o,n,r)=>((e,t)=>A(e,t))(o,n)?m.some(o):a(r)&&r(o)?m.none():t(o,n,r))(0,W,e,t,o),predicate:Q,all:(e,t)=>{const o=a(t)?t:c;let n=e.dom;const r=[];for(;null!==n.parentNode&&void 0!==n.parentNode;){const e=n.parentNode,t=T.fromDom(e);if(r.push(t),!0===o(t))break;n=e}return r}}),down:l({selector:(e,t)=>((e,t)=>{const o=void 0===t?document:t.dom;return C(o)?[]:p(o.querySelectorAll(e),T.fromDom)})(t,e),predicate:Z}),styles:l({get:(e,t)=>{const o=e.dom,n=window.getComputedStyle(o).getPropertyValue(t);return""!==n||_(e)?n:G(o,t)},getRaw:(e,t)=>{const o=e.dom,n=G(o,t);return m.from(n).filter((e=>e.length>0))},set:(e,t,n)=>{((e,t,n)=>{if(!o(n))throw console.error("Invalid call to CSS.set. Property ",t,":: Value ",n,":: Element ",e),new Error("CSS value must be a string: "+n);Y(e)&&e.style.setProperty(t,n)})(e.dom,t,n)},remove:(e,t)=>{((e,t)=>{Y(e)&&e.style.removeProperty(t)})(e.dom,t),((e,t,o=d)=>e.exists((e=>o(e,t))))(F(e,"style").map(v),"")&&K(e,"style")}}),attrs:l({get:z,set:(e,t,o)=>{H(e.dom,t,o)},remove:K,copyTo:(e,t)=>{const o=(n=e.dom.attributes,r=(e,t)=>(e[t.name]=t.value,e),s={},h(n,((e,t)=>{s=r(s,e)})),s);var n,r,s;((e,t)=>{const o=e.dom;((e,t)=>{const o=f(e);for(let n=0,r=o.length;n{H(o,t,e)}))})(t,o)}}),insert:l({before:V,after:I,afterAll:q,append:j,appendAll:(e,t)=>{h(t,(t=>{j(e,t)}))},prepend:(e,t)=>{(e=>(e=>{const t=e.dom.childNodes;return m.from(t[0]).map(T.fromDom)})(e))(e).fold((()=>{j(e,t)}),(o=>{e.dom.insertBefore(t.dom,o.dom)}))},wrap:(e,t)=>{V(e,t),j(t,e)}}),remove:l({unwrap:e=>{const t=L(e);t.length>0&&q(e,t),U(e)},remove:U}),create:l({nu:T.fromTag,clone:e=>T.fromDom(e.dom.cloneNode(!1)),text:T.fromText}),query:l({comparePosition:(e,t)=>e.dom.compareDocumentPosition(t.dom),prevSibling:e=>m.from(e.dom.previousSibling).map(T.fromDom),nextSibling:B}),property:l({children:L,name:x,parent:k,document:e=>{return(t=e,P(t)?t:T.fromDom(t.dom.ownerDocument)).dom;var t},isText:M,isComment:e=>8===D(e)||"#comment"===x(e),isElement:O,isSpecial:e=>{const t=x(e);return g(["script","noscript","iframe","noframes","noembed","title","style","textarea","xmp"],t)},getLanguage:e=>O(e)?F(e,"lang"):m.none(),getText:e=>J.get(e),setText:(e,t)=>J.set(e,t),isBoundary:e=>!!O(e)&&("body"===x(e)||g(ee,x(e))),isEmptyTag:e=>!!O(e)&&g(["br","img","hr","input"],x(e)),isNonEditable:e=>O(e)&&"false"===z(e,"contenteditable")}),eq:(e,t)=>e.dom===t.dom,is:S},ae="details",ie="mce-accordion",le="mce-accordion-summary",de="mce-accordion-body",ce="div";var me=tinymce.util.Tools.resolve("tinymce.util.Tools");const ue=e=>"SUMMARY"===(null==e?void 0:e.nodeName),ge=e=>"DETAILS"===(null==e?void 0:e.nodeName),pe=e=>e.hasAttribute("open"),he=e=>{const t=e.selection.getNode();return ue(t)||Boolean(e.dom.getParent(t,ue))},fe=e=>!he(e)&&e.dom.isEditable(e.selection.getNode())&&!e.mode.isReadOnly(),ye=e=>m.from(e.dom.getParent(e.selection.getNode(),ge)),ve=e=>(e.innerHTML='
      ',e),we=e=>ve(e.dom.create("p")),be=e=>t=>{((e,t)=>{if(ue(null==t?void 0:t.lastChild)){const o=we(e);t.appendChild(o),e.selection.setCursorLocation(o,0)}})(e,t),((e,t)=>{if(!ue(null==t?void 0:t.firstChild)){const o=(e=>ve(e.dom.create("summary")))(e);t.prepend(o),e.selection.setCursorLocation(o,0)}})(e,t)},Ne=e=>{if(!fe(e))return;const t=T.fromDom(e.getBody()),o=(e=>{const t=(new Date).getTime(),o=Math.floor(window.crypto.getRandomValues(new Uint32Array(1))[0]/4294967295*1e9);return y++,e+"_"+o+y+String(t)})("acc"),n=e.dom.encode(e.selection.getRng().toString()||e.translate("Accordion summary...")),r=e.dom.encode(e.translate("Accordion body...")),s=`${n}`,a=`<${ce} class="${de}">

      ${r}

      `;e.undoManager.transact((()=>{e.insertContent([`
      `,s,a,"
      "].join("")),X(t,`[data-mce-id="${o}"]`).each((t=>{K(t,"data-mce-id"),X(t,"summary").each((t=>{const o=e.dom.createRng(),n=re(se,t);o.setStart(n.element.dom,n.offset),o.setEnd(n.element.dom,n.offset),e.selection.setRng(o)}))}))}))},Te=(e,t)=>{const o=null!=t?t:!pe(e);return o?e.setAttribute("open","open"):e.removeAttribute("open"),o},Ae=e=>{e.addCommand("InsertAccordion",(()=>Ne(e))),e.addCommand("ToggleAccordion",((t,o)=>((e,t)=>{ye(e).each((o=>{((e,t,o)=>{e.dispatch("ToggledAccordion",{element:t,state:o})})(e,o,Te(o,t))}))})(e,o))),e.addCommand("ToggleAllAccordions",((t,o)=>((e,t)=>{const o=Array.from(e.getBody().querySelectorAll("details"));0!==o.length&&(h(o,(e=>Te(e,null!=t?t:!pe(e)))),((e,t,o)=>{e.dispatch("ToggledAllAccordions",{elements:t,state:o})})(e,o,t))})(e,o))),e.addCommand("RemoveAccordion",(()=>(e=>{e.mode.isReadOnly()||ye(e).each((t=>{const{nextSibling:o}=t;o?(e.selection.select(o,!0),e.selection.collapse(!0)):((e,t)=>{const o=we(e);t.insertAdjacentElement("afterend",o),e.selection.setCursorLocation(o,0)})(e,t),t.remove()}))})(e)))};var Ce=tinymce.util.Tools.resolve("tinymce.html.Node");const Se=e=>{var t,o;return null!==(o=null===(t=e.attr("class"))||void 0===t?void 0:t.split(" "))&&void 0!==o?o:[]},xe=(e,t)=>{const o=new Set([...Se(e),...t]),n=Array.from(o);n.length>0&&e.attr("class",n.join(" "))},De=(e,t)=>{const o=(e=>{const o=[];for(let r=0,s=e.length;r0?o.join(" "):null)},Ee=e=>e.name===ae&&g(Se(e),ie),Oe=e=>{const t=e.children();let o,n;const s=[];for(let e=0;e{const t=new Ce("br",1);t.attr("data-mce-bogus","1"),e.empty(),e.append(t)};var Pe=tinymce.util.Tools.resolve("tinymce.util.VK");const Re=e=>{(e=>{e.on("keydown",(t=>{(!t.shiftKey&&t.keyCode===Pe.ENTER&&he(e)||(e=>{const t=e.selection.getRng();return ge(t.startContainer)&&t.collapsed&&0===t.startOffset})(e))&&(t.preventDefault(),e.execCommand("ToggleAccordion"))}))})(e),e.on("ExecCommand",(t=>{const o=t.command.toLowerCase();"delete"!==o&&"forwarddelete"!==o||!(e=>ye(e).isSome())(e)||(e=>{me.each(me.grep(e.dom.select("details",e.getBody())),be(e))})(e)}))};var ke=tinymce.util.Tools.resolve("tinymce.Env");const Be=e=>t=>{const o=()=>t.setEnabled(fe(e));return e.on("NodeChange",o),()=>e.off("NodeChange",o)};e.add("accordion",(e=>{(e=>{const t=()=>e.execCommand("InsertAccordion");e.ui.registry.addButton("accordion",{icon:"accordion",tooltip:"Insert accordion",onSetup:Be(e),onAction:t}),e.ui.registry.addMenuItem("accordion",{icon:"accordion",text:"Accordion",onSetup:Be(e),onAction:t}),e.ui.registry.addToggleButton("accordiontoggle",{icon:"accordion-toggle",tooltip:"Toggle accordion",onAction:()=>e.execCommand("ToggleAccordion")}),e.ui.registry.addToggleButton("accordionremove",{icon:"remove",tooltip:"Delete accordion",onAction:()=>e.execCommand("RemoveAccordion")}),e.ui.registry.addContextToolbar("accordion",{predicate:t=>e.dom.is(t,"details")&&e.getBody().contains(t)&&e.dom.isEditable(t.parentNode),items:"accordiontoggle accordionremove",scope:"node",position:"node"})})(e),Ae(e),Re(e),(e=>{e.on("PreInit",(()=>{const{serializer:t,parser:o}=e;o.addNodeFilter(ae,(e=>{for(let t=0;t0)for(let e=0;e{const t=new Set([le]);for(let o=0;o{ke.browser.isSafari()&&e.on("click",(t=>{if(ue(t.target)){const o=t.target,n=e.selection.getRng();n.collapsed&&n.startContainer===o.parentNode&&0===n.startOffset&&e.selection.setCursorLocation(o,0)}}))})(e)}))}(); \ No newline at end of file +!function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager");const t=e=>t=>typeof t===e,o=e=>"string"===(e=>{const t=typeof e;return null===e?"null":"object"===t&&Array.isArray(e)?"array":"object"===t&&(o=n=e,(r=String).prototype.isPrototypeOf(o)||n.constructor?.name===r.name)?"string":t;var o,n,r})(e),n=t("boolean"),r=e=>null==e,s=e=>!r(e),a=t("function"),i=t("number"),c=e=>()=>e,d=(e,t)=>e===t,l=c(!1);class m{tag;value;static singletonNone=new m(!1);constructor(e,t){this.tag=e,this.value=t}static some(e){return new m(!0,e)}static none(){return m.singletonNone}fold(e,t){return this.tag?t(this.value):e()}isSome(){return this.tag}isNone(){return!this.tag}map(e){return this.tag?m.some(e(this.value)):m.none()}bind(e){return this.tag?e(this.value):m.none()}exists(e){return this.tag&&e(this.value)}forall(e){return!this.tag||e(this.value)}filter(e){return!this.tag||e(this.value)?this:m.none()}getOr(e){return this.tag?this.value:e}or(e){return this.tag?this:e}getOrThunk(e){return this.tag?this.value:e()}orThunk(e){return this.tag?this:e()}getOrDie(e){if(this.tag)return this.value;throw new Error(e??"Called getOrDie on None")}static from(e){return s(e)?m.some(e):m.none()}getOrNull(){return this.tag?this.value:null}getOrUndefined(){return this.value}each(e){this.tag&&e(this.value)}toArray(){return this.tag?[this.value]:[]}toString(){return this.tag?`some(${this.value})`:"none()"}}const u=Array.prototype.indexOf,p=(e,t)=>{return o=e,n=t,u.call(o,n)>-1;var o,n},g=(e,t)=>{const o=e.length,n=new Array(o);for(let r=0;r{for(let o=0,n=e.length;oe.replace(b,""));var b;const w=(e,t)=>({element:e,offset:t}),N=e=>{if(null==e)throw new Error("Node cannot be null or undefined");return{dom:e}},T={fromHtml:(e,t)=>{const o=(t||document).createElement("div");if(o.innerHTML=e,!o.hasChildNodes()||o.childNodes.length>1){const t="HTML does not have a single root node";throw console.error(t,e),new Error(t)}return N(o.childNodes[0])},fromTag:(e,t)=>{const o=(t||document).createElement(e);return N(o)},fromText:(e,t)=>{const o=(t||document).createTextNode(e);return N(o)},fromDom:N,fromPoint:(e,t,o)=>m.from(e.dom.elementFromPoint(t,o)).map(N)},A=(e,t)=>{const o=e.dom;if(1!==o.nodeType)return!1;{const e=o;if(void 0!==e.matches)return e.matches(t);if(void 0!==e.msMatchesSelector)return e.msMatchesSelector(t);if(void 0!==e.webkitMatchesSelector)return e.webkitMatchesSelector(t);if(void 0!==e.mozMatchesSelector)return e.mozMatchesSelector(t);throw new Error("Browser lacks native selectors")}},C=e=>1!==e.nodeType&&9!==e.nodeType&&11!==e.nodeType||0===e.childElementCount,S=A,x=e=>e.dom.nodeName.toLowerCase(),D=e=>e.dom.nodeType,E=e=>t=>D(t)===e,M=E(1),O=E(3),P=E(9),R=E(11),k=e=>m.from(e.dom.parentNode).map(T.fromDom),B=e=>m.from(e.dom.nextSibling).map(T.fromDom),L=e=>g(e.dom.childNodes,T.fromDom),$=e=>T.fromDom(e.dom.host),V=(e,t)=>{k(e).each(o=>{o.dom.insertBefore(t.dom,e.dom)})},I=(e,t)=>{B(e).fold(()=>{k(e).each(e=>{j(e,t)})},e=>{V(e,t)})},j=(e,t)=>{e.dom.appendChild(t.dom)},q=(e,t)=>{h(t,(o,n)=>{const r=0===n?e:t[n-1];I(r,o)})},H=(e,t,r)=>{if(!(o(r)||n(r)||i(r)))throw console.error("Invalid call to Attribute.set. Key ",t,":: Value ",r,":: Element ",e),new Error("Attribute value was not simple");e.setAttribute(t,r+"")},z=(e,t)=>{const o=e.dom.getAttribute(t);return null===o?void 0:o},F=(e,t)=>m.from(z(e,t)),K=(e,t)=>{e.dom.removeAttribute(t)},U=e=>{const t=e.dom;null!==t.parentNode&&t.parentNode.removeChild(t)},Y=e=>void 0!==e.style&&a(e.style.getPropertyValue),_=e=>{const t=O(e)?e.dom.parentNode:e.dom;if(null==t||null===t.ownerDocument)return!1;const o=t.ownerDocument;return(e=>{const t=(e=>T.fromDom(e.dom.getRootNode()))(e);return R(o=t)&&s(o.dom.host)?m.some(t):m.none();var o})(T.fromDom(t)).fold(()=>o.body.contains(t),(n=_,r=$,e=>n(r(e))));var n,r},G=(e,t)=>Y(e)?e.style.getPropertyValue(t):"",J=(e=>{const t=t=>e(t)?m.from(t.dom.nodeValue):m.none();return{get:o=>{if(!e(o))throw new Error("Can only get text value of a text node");return t(o).getOr("")},getOption:t,set:(t,o)=>{if(!e(t))throw new Error("Can only set raw text value of a text node");t.dom.nodeValue=o}}})(O),Q=(e,t,o)=>{let n=e.dom;const r=a(o)?o:l;for(;n.parentNode;){n=n.parentNode;const e=T.fromDom(n);if(t(e))return m.some(e);if(r(e))break}return m.none()},W=(e,t,o)=>Q(e,e=>A(e,t),o),X=(e,t)=>((e,t)=>{const o=void 0===t?document:t.dom;return C(o)?m.none():m.from(o.querySelector(e)).map(T.fromDom)})(t,e),Z=(e,t)=>{let o=[];return h(L(e),e=>{t(e)&&(o=o.concat([e])),o=o.concat(Z(e,t))}),o};var ee=["body","p","div","article","aside","figcaption","figure","footer","header","nav","section","ol","ul","li","table","thead","tbody","tfoot","caption","tr","td","th","h1","h2","h3","h4","h5","h6","blockquote","pre","address"];const te=(e,t,o)=>e.property().isText(t)&&0===e.property().getText(t).trim().length||e.property().isComment(t)?o(t).bind(t=>te(e,t,o).orThunk(()=>m.some(t))):m.none(),oe=(e,t)=>e.property().isText(t)?e.property().getText(t).length:e.property().children(t).length,ne=(e,t)=>{const o=te(e,t,e.query().prevSibling).getOr(t);if(e.property().isText(o))return w(o,oe(e,o));const n=e.property().children(o);return n.length>0?ne(e,n[n.length-1]):w(o,oe(e,o))},re=ne,se={up:c({selector:W,closest:(e,t,o)=>((e,t,o,n,r)=>((e,t)=>A(e,t))(o,n)?m.some(o):a(r)&&r(o)?m.none():t(o,n,r))(0,W,e,t,o),predicate:Q,all:(e,t)=>{const o=a(t)?t:l;let n=e.dom;const r=[];for(;null!==n.parentNode&&void 0!==n.parentNode;){const e=n.parentNode,t=T.fromDom(e);if(r.push(t),!0===o(t))break;n=e}return r}}),down:c({selector:(e,t)=>((e,t)=>{const o=void 0===t?document:t.dom;return C(o)?[]:g(o.querySelectorAll(e),T.fromDom)})(t,e),predicate:Z}),styles:c({get:(e,t)=>{const o=e.dom,n=window.getComputedStyle(o).getPropertyValue(t);return""!==n||_(e)?n:G(o,t)},getRaw:(e,t)=>{const o=e.dom,n=G(o,t);return m.from(n).filter(e=>e.length>0)},set:(e,t,n)=>{((e,t,n)=>{if(!o(n))throw console.error("Invalid call to CSS.set. Property ",t,":: Value ",n,":: Element ",e),new Error("CSS value must be a string: "+n);Y(e)&&e.style.setProperty(t,n)})(e.dom,t,n)},remove:(e,t)=>{((e,t)=>{Y(e)&&e.style.removeProperty(t)})(e.dom,t),((e,t,o=d)=>e.exists(e=>o(e,t)))(F(e,"style").map(v),"")&&K(e,"style")}}),attrs:c({get:z,set:(e,t,o)=>{H(e.dom,t,o)},remove:K,copyTo:(e,t)=>{const o=(n=e.dom.attributes,r=(e,t)=>(e[t.name]=t.value,e),s={},h(n,(e,t)=>{s=r(s,e)}),s);var n,r,s;((e,t)=>{const o=e.dom;((e,t)=>{const o=f(e);for(let n=0,r=o.length;n{H(o,t,e)})})(t,o)}}),insert:c({before:V,after:I,afterAll:q,append:j,appendAll:(e,t)=>{h(t,t=>{j(e,t)})},prepend:(e,t)=>{(e=>(e=>{const t=e.dom.childNodes;return m.from(t[0]).map(T.fromDom)})(e))(e).fold(()=>{j(e,t)},o=>{e.dom.insertBefore(t.dom,o.dom)})},wrap:(e,t)=>{V(e,t),j(t,e)}}),remove:c({unwrap:e=>{const t=L(e);t.length>0&&q(e,t),U(e)},remove:U}),create:c({nu:T.fromTag,clone:e=>T.fromDom(e.dom.cloneNode(!1)),text:T.fromText}),query:c({comparePosition:(e,t)=>e.dom.compareDocumentPosition(t.dom),prevSibling:e=>m.from(e.dom.previousSibling).map(T.fromDom),nextSibling:B}),property:c({children:L,name:x,parent:k,document:e=>{return(t=e,P(t)?t:T.fromDom(t.dom.ownerDocument)).dom;var t},isText:O,isComment:e=>8===D(e)||"#comment"===x(e),isElement:M,isSpecial:e=>{const t=x(e);return p(["script","noscript","iframe","noframes","noembed","title","style","textarea","xmp"],t)},getLanguage:e=>M(e)?F(e,"lang"):m.none(),getText:e=>J.get(e),setText:(e,t)=>J.set(e,t),isBoundary:e=>!!M(e)&&("body"===x(e)||p(ee,x(e))),isEmptyTag:e=>!!M(e)&&p(["br","img","hr","input"],x(e)),isNonEditable:e=>M(e)&&"false"===z(e,"contenteditable")}),eq:(e,t)=>e.dom===t.dom,is:S},ae=e=>e.options.get("disabled"),ie="details",ce="mce-accordion",de="mce-accordion-summary",le="mce-accordion-body",me="div",ue="data-mce-accordion-open";var pe=tinymce.util.Tools.resolve("tinymce.util.Tools");const ge=e=>"SUMMARY"===e?.nodeName,he=e=>"DETAILS"===e?.nodeName,fe=e=>e.hasAttribute("open"),ye=e=>{const t=e.selection.getNode();return ge(t)||Boolean(e.dom.getParent(t,ge))},ve=e=>!ye(e)&&e.dom.isEditable(e.selection.getNode())&&!e.mode.isReadOnly(),be=e=>m.from(e.dom.getParent(e.selection.getNode(),he)),we=e=>(e.innerHTML='
      ',e),Ne=e=>we(e.dom.create("p")),Te=e=>t=>{((e,t)=>{if(ge(t?.lastChild)){const o=Ne(e);t.appendChild(o),e.selection.setCursorLocation(o,0)}})(e,t),((e,t)=>{if(!ge(t?.firstChild)){const o=(e=>we(e.dom.create("summary")))(e);t.prepend(o),e.selection.setCursorLocation(o,0)}})(e,t)},Ae=e=>{if(!ve(e))return;const t=T.fromDom(e.getBody()),o=(e=>{const t=(new Date).getTime(),o=Math.floor(window.crypto.getRandomValues(new Uint32Array(1))[0]/4294967295*1e9);return y++,e+"_"+o+y+String(t)})("acc"),n=e.dom.encode(e.selection.getRng().toString()||e.translate("Accordion summary...")),r=e.dom.encode(e.translate("Accordion body...")),s=`${n}`,a=`<${me} class="${le}">

      ${r}

      `;e.undoManager.transact(()=>{e.insertContent([`
      `,s,a,"
      "].join("")),X(t,`[data-mce-id="${o}"]`).each(t=>{K(t,"data-mce-id"),X(t,"summary").each(t=>{const o=e.dom.createRng(),n=re(se,t);o.setStart(n.element.dom,n.offset),o.setEnd(n.element.dom,n.offset),e.selection.setRng(o)})})})},Ce=(e,t,o)=>{const n=o??!fe(t);return e||t.setAttribute(ue,n?"open":"closed"),n?t.setAttribute("open","open"):t.removeAttribute("open"),n},Se=e=>{e.addCommand("InsertAccordion",()=>Ae(e)),e.addCommand("ToggleAccordion",(t,o)=>((e,t)=>{ae(e)||be(e).each(o=>{((e,t,o)=>{e.dispatch("ToggledAccordion",{element:t,state:o})})(e,o,Ce(e.readonly,o,t))})})(e,o)),e.addCommand("ToggleAllAccordions",(t,o)=>((e,t)=>{const o=Array.from(e.getBody().querySelectorAll("details"));0!==o.length&&(h(o,o=>Ce(e.readonly,o,t??!fe(o))),((e,t,o)=>{e.dispatch("ToggledAllAccordions",{elements:t,state:o})})(e,o,t))})(e,o)),e.addCommand("RemoveAccordion",()=>(e=>{e.mode.isReadOnly()||be(e).each(t=>{const{nextSibling:o}=t;o?(e.selection.select(o,!0),e.selection.collapse(!0)):((e,t)=>{const o=Ne(e);t.insertAdjacentElement("afterend",o),e.selection.setCursorLocation(o,0)})(e,t),t.remove()})})(e))};var xe=tinymce.util.Tools.resolve("tinymce.html.Node");const De=e=>{Ee(e,"open")&&Me(e,"open","open")},Ee=(e,t)=>void 0!==e.attr(t),Me=(e,t,o)=>{e.attr(t,o)},Oe=e=>e.attr("class")?.split(" ")??[],Pe=(e,t)=>{const o=new Set([...Oe(e),...t]),n=Array.from(o);n.length>0&&e.attr("class",n.join(" "))},Re=(e,t)=>{const o=((e,t)=>{const o=[];for(let n=0,r=e.length;n!t.has(e));e.attr("class",o.length>0?o.join(" "):null)},ke=e=>e.name===ie&&p(Oe(e),ce),Be=e=>e.name===me&&p(Oe(e),le),Le=e=>{const t=e.children();let o,n;const s=[];for(let e=0;e{const t=new xe("br",1);t.attr("data-mce-bogus","1"),e.empty(),e.append(t)};var Ve=tinymce.util.Tools.resolve("tinymce.util.VK");const Ie=e=>{(e=>{e.on("keydown",t=>{(!t.shiftKey&&t.keyCode===Ve.ENTER&&ye(e)||(e=>{const t=e.selection.getRng();return he(t.startContainer)&&t.collapsed&&0===t.startOffset})(e))&&(t.preventDefault(),e.execCommand("ToggleAccordion"))})})(e),e.on("ExecCommand",t=>{const o=t.command.toLowerCase();"delete"!==o&&"forwarddelete"!==o||!(e=>be(e).isSome())(e)||(e=>{pe.each(pe.grep(e.dom.select("details",e.getBody())),Te(e))})(e)})};var je=tinymce.util.Tools.resolve("tinymce.Env");const qe=e=>t=>{const o=()=>t.setEnabled(ve(e));return e.on("NodeChange",o),()=>e.off("NodeChange",o)},He="accordion";e.add(He,e=>((e=>{const t=()=>e.execCommand("InsertAccordion");e.ui.registry.addButton("accordion",{icon:"accordion",tooltip:"Insert accordion",onSetup:qe(e),onAction:t}),e.ui.registry.addMenuItem("accordion",{icon:"accordion",text:"Accordion",onSetup:qe(e),onAction:t}),e.ui.registry.addToggleButton("accordiontoggle",{icon:"accordion-toggle",tooltip:"Toggle accordion",onAction:()=>e.execCommand("ToggleAccordion"),context:"any"}),e.ui.registry.addToggleButton("accordionremove",{icon:"remove",tooltip:"Delete accordion",onAction:()=>e.execCommand("RemoveAccordion")}),e.ui.registry.addContextToolbar("accordion",{predicate:t=>e.dom.is(t,"details")&&e.getBody().contains(t)&&e.dom.isEditable(t.parentNode),items:"accordiontoggle accordionremove",scope:"node",position:"node"})})(e),Se(e),Ie(e),(e=>{e.on("PreInit",()=>{const{serializer:t,parser:o}=e;o.addNodeFilter(ie,e=>{for(let t=0;t0)for(let e=0;e{const t=new Set([de]);for(let o=0;o{je.browser.isSafari()&&e.on("click",t=>{if(ge(t.target)){const o=t.target,n=e.selection.getRng();n.collapsed&&n.startContainer===o.parentNode&&0===n.startOffset&&e.selection.setCursorLocation(o,0)}})})(e),{getMetadata:()=>({name:"Accordion",type:"opensource",slug:He})}))}(); \ No newline at end of file diff --git a/public/assets/tinymce/plugins/advlist/plugin.js b/public/assets/tinymce/plugins/advlist/plugin.js index 752fa2d57..7dd80448b 100644 --- a/public/assets/tinymce/plugins/advlist/plugin.js +++ b/public/assets/tinymce/plugins/advlist/plugin.js @@ -1,5 +1,5 @@ /** - * TinyMCE version 8.1.2 (TBD) + * TinyMCE version 8.10.0 (2026-10-14) */ (function () { @@ -56,6 +56,11 @@ * strict-null-checks */ class Optional { + tag; + value; + // Sneaky optimisation: every instance of Optional.none is identical, so just + // reuse the same object + static singletonNone = new Optional(false); // The internal representation has a `tag` and a `value`, but both are // private: able to be console.logged, but not able to be accessed by code constructor(tag, value) { @@ -223,7 +228,7 @@ */ getOrDie(message) { if (!this.tag) { - throw new Error(message !== null && message !== void 0 ? message : 'Called getOrDie on None'); + throw new Error(message ?? 'Called getOrDie on None'); } else { return this.value; @@ -287,9 +292,6 @@ return this.tag ? `some(${this.value})` : 'none()'; } } - // Sneaky optimisation: every instance of Optional.none is identical, so just - // reuse the same object - Optional.singletonNone = new Optional(false); const nativeIndexOf = Array.prototype.indexOf; const rawIndexOf = (ts, t) => nativeIndexOf.call(ts, t); @@ -347,9 +349,20 @@ const inList = (editor, parents, nodeName) => findUntil(parents, (parent) => isListNode(parent) && !isCustomList(parent), isTableCellNode) .exists((list) => list.nodeName === nodeName && isChildOfBody(editor, list)); const getSelectedStyleType = (editor) => { - const listElm = editor.dom.getParent(editor.selection.getNode(), 'ol,ul'); - const style = editor.dom.getStyle(listElm, 'listStyleType'); - return Optional.from(style); + const dom = editor.dom; + const node = editor.selection.getNode(); + const listElm = dom.getParent(node, 'ol,ul'); + if (isNullable(listElm)) { + return Optional.none(); + } + // A `list-style-type` on the item wins over the one on the list, so the item has to be checked + // first for the toolbar to reflect the correct style + const listItemElm = dom.getParent(node, 'li', listElm); + const itemStyleType = Optional.from(listItemElm) + .bind((listItemElm) => Optional.from(dom.getStyle(listItemElm, 'listStyleType'))) + // `none` marks the items that only wrap a nested list + .filter((styleType) => styleType !== '' && styleType !== 'none'); + return itemStyleType.orThunk(() => Optional.from(dom.getStyle(listElm, 'listStyleType'))); }; // Lists/core/Util.ts - Duplicated in Lists plugin const isWithinNonEditable = (editor, element) => element !== null && !editor.dom.isEditable(element); @@ -394,7 +407,7 @@ const stylesContainsAliasMap = map(listStyleTypeAliases, (alias) => contains(styles, alias)); editor.ui.registry.addSplitButton(id, { tooltip, - chevronTooltip: `${tooltip} menu`, + chevronTooltip: tooltip, icon: nodeName === "OL" /* ListType.OrderedList */ ? 'ordered-list' : 'unordered-list', presets: 'listpreview', columns: nodeName === "OL" /* ListType.OrderedList */ ? 3 : 4, @@ -447,8 +460,9 @@ addControl(editor, 'bullist', 'Bullet list', 'InsertUnorderedList', "UL" /* ListType.UnorderedList */, getBulletStyles(editor)); }; + const PLUGIN_CODE = 'advlist'; var Plugin = () => { - global$1.add('advlist', (editor) => { + global$1.add(PLUGIN_CODE, (editor) => { if (editor.hasPlugin('lists')) { register$1(editor); register(editor); @@ -458,6 +472,9 @@ // eslint-disable-next-line no-console console.error('Please use the Lists plugin together with the List Styles plugin.'); } + return { + getMetadata: () => ({ name: 'List Styles', type: 'opensource', slug: PLUGIN_CODE }) + }; }); }; diff --git a/public/assets/tinymce/plugins/advlist/plugin.min.js b/public/assets/tinymce/plugins/advlist/plugin.min.js index aeced53ae..369c9f5f0 100644 --- a/public/assets/tinymce/plugins/advlist/plugin.min.js +++ b/public/assets/tinymce/plugins/advlist/plugin.min.js @@ -1 +1 @@ -!function(){"use strict";var t=tinymce.util.Tools.resolve("tinymce.PluginManager");const e=(t,e,r)=>{const s="UL"===e?"InsertUnorderedList":"InsertOrderedList";t.execCommand(s,!1,!1===r?null:{"list-style-type":r})},r=t=>e=>e.options.get(t),s=r("advlist_number_styles"),n=r("advlist_bullet_styles"),l=t=>null==t,o=t=>!l(t);class i{constructor(t,e){this.tag=t,this.value=e}static some(t){return new i(!0,t)}static none(){return i.singletonNone}fold(t,e){return this.tag?e(this.value):t()}isSome(){return this.tag}isNone(){return!this.tag}map(t){return this.tag?i.some(t(this.value)):i.none()}bind(t){return this.tag?t(this.value):i.none()}exists(t){return this.tag&&t(this.value)}forall(t){return!this.tag||t(this.value)}filter(t){return!this.tag||t(this.value)?this:i.none()}getOr(t){return this.tag?this.value:t}or(t){return this.tag?this:t}getOrThunk(t){return this.tag?this.value:t()}orThunk(t){return this.tag?this:t()}getOrDie(t){if(this.tag)return this.value;throw new Error(null!=t?t:"Called getOrDie on None")}static from(t){return o(t)?i.some(t):i.none()}getOrNull(){return this.tag?this.value:null}getOrUndefined(){return this.value}each(t){this.tag&&t(this.value)}toArray(){return this.tag?[this.value]:[]}toString(){return this.tag?`some(${this.value})`:"none()"}}i.singletonNone=new i(!1);const a=Array.prototype.indexOf,u=Object.keys;var d=tinymce.util.Tools.resolve("tinymce.util.Tools");const c=t=>e=>o(e)&&t.test(e.nodeName),h=c(/^(OL|UL|DL)$/),g=c(/^(TH|TD)$/),p=t=>l(t)||"default"===t?"":t,m=(t,e)=>r=>((t,e)=>{const r=t.selection.getNode();return e({parents:t.dom.getParents(r),element:r}),t.on("NodeChange",e),()=>t.off("NodeChange",e)})(t,(s=>((t,s)=>{const n=t.selection.getStart(!0);r.setActive(((t,e,r)=>((t,e,r)=>{for(let e=0,n=t.length;ee.nodeName===r&&((t,e)=>t.dom.isChildOf(e,t.getBody()))(t,e))))(t,s,e)),r.setEnabled(!((t,e)=>{const r=t.dom.getParent(e,"ol,ul,dl");return((t,e)=>null!==e&&!t.dom.isEditable(e))(t,r)||!t.selection.isEditable()})(t,n))})(t,s.parents))),v=(t,r,s,n,l,o)=>{const c={"lower-latin":"lower-alpha","upper-latin":"upper-alpha","lower-alpha":"lower-latin","upper-alpha":"upper-latin"},h=(g=t=>{return e=o,r=t,a.call(e,r)>-1;var e,r},((t,e)=>{const r={};return((t,e)=>{const r=u(t);for(let s=0,n=r.length;s{const n=e(t,s);r[n.k]=n.v})),r})(c,((t,e)=>({k:e,v:g(t)}))));var g;t.ui.registry.addSplitButton(r,{tooltip:s,chevronTooltip:`${s} menu`,icon:"OL"===l?"ordered-list":"unordered-list",presets:"listpreview",columns:"OL"===l?3:4,fetch:t=>{t(d.map(o,(t=>{const e="OL"===l?"num":"bull",r="decimal"===t?"default":t,s=p(t),n=(t=>t.replace(/\-/g," ").replace(/\b\w/g,(t=>t.toUpperCase())))(t);return{type:"choiceitem",value:s,icon:"list-"+e+"-"+r,text:n}})))},onAction:()=>t.execCommand(n),onItemAction:(r,s)=>{e(t,l,s)},select:e=>{const r=(t=>{const e=t.dom.getParent(t.selection.getNode(),"ol,ul"),r=t.dom.getStyle(e,"listStyleType");return i.from(r)})(t);return r.exists((t=>e===t||c[t]===e&&!h[e]))},onSetup:m(t,l)})},y=(t,r,s,n,l,o)=>{o.length>1?v(t,r,s,n,l,o):((t,r,s,n,l,o)=>{t.ui.registry.addToggleButton(r,{active:!1,tooltip:s,icon:"OL"===l?"ordered-list":"unordered-list",onSetup:m(t,l),onAction:()=>t.queryCommandState(n)||""===o?t.execCommand(n):e(t,l,o)})})(t,r,s,n,l,p(o[0]))};t.add("advlist",(t=>{t.hasPlugin("lists")?((t=>{const e=t.options.register;e("advlist_number_styles",{processor:"string[]",default:"default,lower-alpha,lower-greek,lower-roman,upper-alpha,upper-roman".split(",")}),e("advlist_bullet_styles",{processor:"string[]",default:"default,disc,circle,square".split(",")})})(t),(t=>{y(t,"numlist","Numbered list","InsertOrderedList","OL",s(t)),y(t,"bullist","Bullet list","InsertUnorderedList","UL",n(t))})(t),(t=>{t.addCommand("ApplyUnorderedListStyle",((r,s)=>{e(t,"UL",s["list-style-type"])})),t.addCommand("ApplyOrderedListStyle",((r,s)=>{e(t,"OL",s["list-style-type"])}))})(t)):console.error("Please use the Lists plugin together with the List Styles plugin.")}))}(); \ No newline at end of file +!function(){"use strict";var t=tinymce.util.Tools.resolve("tinymce.PluginManager");const e=(t,e,r)=>{const s="UL"===e?"InsertUnorderedList":"InsertOrderedList";t.execCommand(s,!1,!1===r?null:{"list-style-type":r})},r=t=>e=>e.options.get(t),s=r("advlist_number_styles"),n=r("advlist_bullet_styles"),l=t=>null==t,o=t=>!l(t);class i{tag;value;static singletonNone=new i(!1);constructor(t,e){this.tag=t,this.value=e}static some(t){return new i(!0,t)}static none(){return i.singletonNone}fold(t,e){return this.tag?e(this.value):t()}isSome(){return this.tag}isNone(){return!this.tag}map(t){return this.tag?i.some(t(this.value)):i.none()}bind(t){return this.tag?t(this.value):i.none()}exists(t){return this.tag&&t(this.value)}forall(t){return!this.tag||t(this.value)}filter(t){return!this.tag||t(this.value)?this:i.none()}getOr(t){return this.tag?this.value:t}or(t){return this.tag?this:t}getOrThunk(t){return this.tag?this.value:t()}orThunk(t){return this.tag?this:t()}getOrDie(t){if(this.tag)return this.value;throw new Error(t??"Called getOrDie on None")}static from(t){return o(t)?i.some(t):i.none()}getOrNull(){return this.tag?this.value:null}getOrUndefined(){return this.value}each(t){this.tag&&t(this.value)}toArray(){return this.tag?[this.value]:[]}toString(){return this.tag?`some(${this.value})`:"none()"}}const a=Array.prototype.indexOf,u=Object.keys;var d=tinymce.util.Tools.resolve("tinymce.util.Tools");const c=t=>e=>o(e)&&t.test(e.nodeName),g=c(/^(OL|UL|DL)$/),h=c(/^(TH|TD)$/),p=t=>l(t)||"default"===t?"":t,m=(t,e)=>r=>((t,e)=>{const r=t.selection.getNode();return e({parents:t.dom.getParents(r),element:r}),t.on("NodeChange",e),()=>t.off("NodeChange",e)})(t,s=>((t,s)=>{const n=t.selection.getStart(!0);r.setActive(((t,e,r)=>((t,e,r)=>{for(let s=0,n=t.length;sg(t)&&!/\btox\-/.test(t.className),h).exists(e=>e.nodeName===r&&((t,e)=>t.dom.isChildOf(e,t.getBody()))(t,e)))(t,s,e)),r.setEnabled(!((t,e)=>{const r=t.dom.getParent(e,"ol,ul,dl");return((t,e)=>null!==e&&!t.dom.isEditable(e))(t,r)||!t.selection.isEditable()})(t,n))})(t,s.parents)),y=(t,r,s,n,o,c)=>{const g={"lower-latin":"lower-alpha","upper-latin":"upper-alpha","lower-alpha":"lower-latin","upper-alpha":"upper-latin"},h=(y=t=>{return e=c,r=t,a.call(e,r)>-1;var e,r},((t,e)=>{const r={};return((t,e)=>{const r=u(t);for(let s=0,n=r.length;s{const n=e(t,s);r[n.k]=n.v}),r})(g,(t,e)=>({k:e,v:y(t)})));var y;t.ui.registry.addSplitButton(r,{tooltip:s,chevronTooltip:s,icon:"OL"===o?"ordered-list":"unordered-list",presets:"listpreview",columns:"OL"===o?3:4,fetch:t=>{t(d.map(c,t=>{const e="OL"===o?"num":"bull",r="decimal"===t?"default":t,s=p(t),n=(t=>t.replace(/\-/g," ").replace(/\b\w/g,t=>t.toUpperCase()))(t);return{type:"choiceitem",value:s,icon:"list-"+e+"-"+r,text:n}}))},onAction:()=>t.execCommand(n),onItemAction:(r,s)=>{e(t,o,s)},select:e=>{const r=(t=>{const e=t.dom,r=t.selection.getNode(),s=e.getParent(r,"ol,ul");if(l(s))return i.none();const n=e.getParent(r,"li",s);return i.from(n).bind(t=>i.from(e.getStyle(t,"listStyleType"))).filter(t=>""!==t&&"none"!==t).orThunk(()=>i.from(e.getStyle(s,"listStyleType")))})(t);return r.exists(t=>e===t||g[t]===e&&!h[e])},onSetup:m(t,o)})},v=(t,r,s,n,l,o)=>{o.length>1?y(t,r,s,n,l,o):((t,r,s,n,l,o)=>{t.ui.registry.addToggleButton(r,{active:!1,tooltip:s,icon:"OL"===l?"ordered-list":"unordered-list",onSetup:m(t,l),onAction:()=>t.queryCommandState(n)||""===o?t.execCommand(n):e(t,l,o)})})(t,r,s,n,l,p(o[0]))},f="advlist";t.add(f,t=>(t.hasPlugin("lists")?((t=>{const e=t.options.register;e("advlist_number_styles",{processor:"string[]",default:"default,lower-alpha,lower-greek,lower-roman,upper-alpha,upper-roman".split(",")}),e("advlist_bullet_styles",{processor:"string[]",default:"default,disc,circle,square".split(",")})})(t),(t=>{v(t,"numlist","Numbered list","InsertOrderedList","OL",s(t)),v(t,"bullist","Bullet list","InsertUnorderedList","UL",n(t))})(t),(t=>{t.addCommand("ApplyUnorderedListStyle",(r,s)=>{e(t,"UL",s["list-style-type"])}),t.addCommand("ApplyOrderedListStyle",(r,s)=>{e(t,"OL",s["list-style-type"])})})(t)):console.error("Please use the Lists plugin together with the List Styles plugin."),{getMetadata:()=>({name:"List Styles",type:"opensource",slug:f})}))}(); \ No newline at end of file diff --git a/public/assets/tinymce/plugins/anchor/plugin.js b/public/assets/tinymce/plugins/anchor/plugin.js index e4ab4afe9..7d707863d 100644 --- a/public/assets/tinymce/plugins/anchor/plugin.js +++ b/public/assets/tinymce/plugins/anchor/plugin.js @@ -1,5 +1,5 @@ /** - * TinyMCE version 8.1.2 (TBD) + * TinyMCE version 8.10.0 (2026-10-14) */ (function () { @@ -215,8 +215,9 @@ }); }; + const PLUGIN_CODE = 'anchor'; var Plugin = () => { - global$2.add('anchor', (editor) => { + global$2.add(PLUGIN_CODE, (editor) => { register$2(editor); setup(editor); register$1(editor); @@ -224,6 +225,9 @@ editor.on('PreInit', () => { registerFormats(editor); }); + return { + getMetadata: () => ({ name: 'Anchor', type: 'opensource', slug: PLUGIN_CODE }) + }; }); }; diff --git a/public/assets/tinymce/plugins/anchor/plugin.min.js b/public/assets/tinymce/plugins/anchor/plugin.min.js index c52c6d780..8ba104566 100644 --- a/public/assets/tinymce/plugins/anchor/plugin.min.js +++ b/public/assets/tinymce/plugins/anchor/plugin.min.js @@ -1 +1 @@ -!function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager"),t=tinymce.util.Tools.resolve("tinymce.dom.RangeUtils"),o=tinymce.util.Tools.resolve("tinymce.util.Tools");const n=e=>e.options.get("allow_html_in_named_anchor");const a="a:not([href])",r=e=>!e,i=e=>e.getAttribute("id")||e.getAttribute("name")||"",l=e=>(e=>"a"===e.nodeName.toLowerCase())(e)&&!e.getAttribute("href")&&""!==i(e),s=e=>e.dom.getParent(e.selection.getStart(),a),d=(e,a)=>{const r=s(e);r?((e,t,o)=>{o.removeAttribute("name"),o.id=t,e.addVisual(),e.undoManager.add()})(e,a,r):((e,a)=>{e.undoManager.transact((()=>{n(e)||e.selection.collapse(!0),e.selection.isCollapsed()?e.insertContent(e.dom.createHTML("a",{id:a})):((e=>{const n=e.dom;t(n).walk(e.selection.getRng(),(e=>{o.each(e,(e=>{var t;l(t=e)&&!t.firstChild&&n.remove(e,!1)}))}))})(e),e.formatter.remove("namedAnchor",void 0,void 0,!0),e.formatter.apply("namedAnchor",{value:a}),e.addVisual())}))})(e,a),e.focus()},c=e=>(e=>r(e.attr("href"))&&!r(e.attr("id")||e.attr("name")))(e)&&!e.firstChild,m=e=>t=>{for(let o=0;ot=>{const o=()=>{t.setEnabled(e.selection.isEditable())};return e.on("NodeChange",o),o(),()=>{e.off("NodeChange",o)}};e.add("anchor",(e=>{(e=>{(0,e.options.register)("allow_html_in_named_anchor",{processor:"boolean",default:!1})})(e),(e=>{e.on("PreInit",(()=>{e.parser.addNodeFilter("a",m("false")),e.serializer.addNodeFilter("a",m(null))}))})(e),(e=>{e.addCommand("mceAnchor",(()=>{(e=>{const t=(e=>{const t=s(e);return t?i(t):""})(e);e.windowManager.open({title:"Anchor",size:"normal",body:{type:"panel",items:[{name:"id",type:"input",label:"ID",placeholder:"example"}]},buttons:[{type:"cancel",name:"cancel",text:"Cancel"},{type:"submit",name:"save",text:"Save",primary:!0}],initialData:{id:t},onSubmit:t=>{((e,t)=>/^[A-Za-z][A-Za-z0-9\-:._]*$/.test(t)?(d(e,t),!0):(e.windowManager.alert("ID should start with a letter, followed only by letters, numbers, dashes, dots, colons or underscores."),!1))(e,t.getData().id)&&t.close()}})})(e)}))})(e),(e=>{const t=()=>e.execCommand("mceAnchor");e.ui.registry.addToggleButton("anchor",{icon:"bookmark",tooltip:"Anchor",onAction:t,onSetup:t=>{const o=e.selection.selectorChangedWithUnbind("a:not([href])",t.setActive).unbind,n=u(e)(t);return()=>{o(),n()}}}),e.ui.registry.addMenuItem("anchor",{icon:"bookmark",text:"Anchor...",onAction:t,onSetup:u(e)})})(e),e.on("PreInit",(()=>{(e=>{e.formatter.register("namedAnchor",{inline:"a",selector:a,remove:"all",split:!0,deep:!0,attributes:{id:"%value"},onmatch:(e,t,o)=>l(e)})})(e)}))}))}(); \ No newline at end of file +!function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager"),t=tinymce.util.Tools.resolve("tinymce.dom.RangeUtils"),o=tinymce.util.Tools.resolve("tinymce.util.Tools");const n=e=>e.options.get("allow_html_in_named_anchor");const a="a:not([href])",r=e=>!e,i=e=>e.getAttribute("id")||e.getAttribute("name")||"",l=e=>(e=>"a"===e.nodeName.toLowerCase())(e)&&!e.getAttribute("href")&&""!==i(e),s=e=>e.dom.getParent(e.selection.getStart(),a),d=(e,a)=>{const r=s(e);r?((e,t,o)=>{o.removeAttribute("name"),o.id=t,e.addVisual(),e.undoManager.add()})(e,a,r):((e,a)=>{e.undoManager.transact(()=>{n(e)||e.selection.collapse(!0),e.selection.isCollapsed()?e.insertContent(e.dom.createHTML("a",{id:a})):((e=>{const n=e.dom;t(n).walk(e.selection.getRng(),e=>{o.each(e,e=>{var t;l(t=e)&&!t.firstChild&&n.remove(e,!1)})})})(e),e.formatter.remove("namedAnchor",void 0,void 0,!0),e.formatter.apply("namedAnchor",{value:a}),e.addVisual())})})(e,a),e.focus()},c=e=>(e=>r(e.attr("href"))&&!r(e.attr("id")||e.attr("name")))(e)&&!e.firstChild,m=e=>t=>{for(let o=0;ot=>{const o=()=>{t.setEnabled(e.selection.isEditable())};return e.on("NodeChange",o),o(),()=>{e.off("NodeChange",o)}},h="anchor";e.add(h,e=>((e=>{(0,e.options.register)("allow_html_in_named_anchor",{processor:"boolean",default:!1})})(e),(e=>{e.on("PreInit",()=>{e.parser.addNodeFilter("a",m("false")),e.serializer.addNodeFilter("a",m(null))})})(e),(e=>{e.addCommand("mceAnchor",()=>{(e=>{const t=(e=>{const t=s(e);return t?i(t):""})(e);e.windowManager.open({title:"Anchor",size:"normal",body:{type:"panel",items:[{name:"id",type:"input",label:"ID",placeholder:"example"}]},buttons:[{type:"cancel",name:"cancel",text:"Cancel"},{type:"submit",name:"save",text:"Save",primary:!0}],initialData:{id:t},onSubmit:t=>{((e,t)=>/^[A-Za-z][A-Za-z0-9\-:._]*$/.test(t)?(d(e,t),!0):(e.windowManager.alert("ID should start with a letter, followed only by letters, numbers, dashes, dots, colons or underscores."),!1))(e,t.getData().id)&&t.close()}})})(e)})})(e),(e=>{const t=()=>e.execCommand("mceAnchor");e.ui.registry.addToggleButton("anchor",{icon:"bookmark",tooltip:"Anchor",onAction:t,onSetup:t=>{const o=e.selection.selectorChangedWithUnbind("a:not([href])",t.setActive).unbind,n=u(e)(t);return()=>{o(),n()}}}),e.ui.registry.addMenuItem("anchor",{icon:"bookmark",text:"Anchor...",onAction:t,onSetup:u(e)})})(e),e.on("PreInit",()=>{(e=>{e.formatter.register("namedAnchor",{inline:"a",selector:a,remove:"all",split:!0,deep:!0,attributes:{id:"%value"},onmatch:(e,t,o)=>l(e)})})(e)}),{getMetadata:()=>({name:"Anchor",type:"opensource",slug:h})}))}(); \ No newline at end of file diff --git a/public/assets/tinymce/plugins/autolink/plugin.js b/public/assets/tinymce/plugins/autolink/plugin.js index fb5960655..53822218b 100644 --- a/public/assets/tinymce/plugins/autolink/plugin.js +++ b/public/assets/tinymce/plugins/autolink/plugin.js @@ -1,5 +1,5 @@ /** - * TinyMCE version 8.1.2 (TBD) + * TinyMCE version 8.10.0 (2026-10-14) */ (function () { @@ -9,13 +9,12 @@ /* eslint-disable @typescript-eslint/no-wrapper-object-types */ const hasProto = (v, constructor, predicate) => { - var _a; if (predicate(v, constructor.prototype)) { return true; } else { // String-based fallback time - return ((_a = v.constructor) === null || _a === void 0 ? void 0 : _a.name) === constructor.name; + return v.constructor?.name === constructor.name; } }; const typeOf = (x) => { @@ -182,7 +181,6 @@ }; const parseCurrentLine = (editor, offset) => { - var _a; const voidElements = editor.schema.getVoidElements(); const autoLinkPattern = getAutoLinkPattern(editor); const { dom, selection } = editor; @@ -197,7 +195,7 @@ // Descend down the end container to find the text node const { container: endContainer, offset: endOffset } = freefallRtl(rng.endContainer, rng.endOffset); // Find the root container to use when walking - const root = (_a = dom.getParent(endContainer, dom.isBlock)) !== null && _a !== void 0 ? _a : dom.getRoot(); + const root = dom.getParent(endContainer, dom.isBlock) ?? dom.getRoot(); // Move the selection backwards to the start of the potential URL to account for the pressed character // while also excluding the last full stop from a word like "www.site.com." const endSpot = textSeeker.backwards(endContainer, endOffset + offset, (node, offset) => { @@ -300,10 +298,14 @@ }); }; + const PLUGIN_CODE = 'autolink'; var Plugin = () => { - global$1.add('autolink', (editor) => { + global$1.add(PLUGIN_CODE, (editor) => { register(editor); setup(editor); + return { + getMetadata: () => ({ name: 'Autolink', type: 'opensource', slug: PLUGIN_CODE }) + }; }); }; diff --git a/public/assets/tinymce/plugins/autolink/plugin.min.js b/public/assets/tinymce/plugins/autolink/plugin.min.js index 8d9f0548f..3b3703ee2 100644 --- a/public/assets/tinymce/plugins/autolink/plugin.min.js +++ b/public/assets/tinymce/plugins/autolink/plugin.min.js @@ -1 +1 @@ -!function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager");const t=e=>"string"===(e=>{const t=typeof e;return null===e?"null":"object"===t&&Array.isArray(e)?"array":"object"===t&&(n=o=e,(r=String).prototype.isPrototypeOf(n)||(null===(a=o.constructor)||void 0===a?void 0:a.name)===r.name)?"string":t;var n,o,r,a})(e);const n=e=>undefined===e;const o=e=>!(e=>null==e)(e),r=Object.hasOwnProperty,a=e=>"\ufeff"===e,s=e=>t=>t.options.get(e),l=s("autolink_pattern"),i=s("link_default_target"),c=s("link_default_protocol"),d=s("allow_unsafe_link_target");var u=tinymce.util.Tools.resolve("tinymce.dom.TextSeeker");const f=e=>/^[(\[{ \u00a0]$/.test(e),g=(e,t,n)=>{for(let o=t-1;o>=0;o--){const t=e.charAt(o);if(!a(t)&&n(t))return o}return-1},m=(e,t)=>{var o;const a=e.schema.getVoidElements(),s=l(e),{dom:i,selection:d}=e;if(null!==i.getParent(d.getNode(),"a[href]")||e.mode.isReadOnly())return null;const m=d.getRng(),k=u(i,(e=>{return i.isBlock(e)||(t=a,n=e.nodeName.toLowerCase(),r.call(t,n))||"false"===i.getContentEditable(e)||null!==i.getParent(e,"a[href]");var t,n})),{container:p,offset:y}=((e,t)=>{let n=e,o=t;for(;1===n.nodeType&&n.childNodes[o];)n=n.childNodes[o],o=3===n.nodeType?n.data.length:n.childNodes.length;return{container:n,offset:o}})(m.endContainer,m.endOffset),w=null!==(o=i.getParent(p,i.isBlock))&&void 0!==o?o:i.getRoot(),h=k.backwards(p,y+t,((e,t)=>{const n=e.data,o=g(n,t,(r=f,e=>!r(e)));var r,a;return-1===o||(a=n[o],/[?!,.;:]/.test(a))?o:o+1}),w);if(!h)return null;let v=h.container;const _=k.backwards(h.container,h.offset,((e,t)=>{v=e;const n=g(e.data,t,f);return-1===n?n:n+1}),w),A=i.createRng();_?A.setStart(_.container,_.offset):A.setStart(v,0),A.setEnd(h.container,h.offset);const C=A.toString().replace(/\uFEFF/g,"").match(s);if(C){let t=C[0];return P="www.",(b=t).length>=4&&b.substr(0,4)===P?t=c(e)+"://"+t:((e,t,o=0,r)=>{const a=e.indexOf(t,o);return-1!==a&&(!!n(r)||a+t.length<=r)})(t,"@")&&!(e=>/^([A-Za-z][A-Za-z\d.+-]*:\/\/)|mailto:/.test(e))(t)&&(t="mailto:"+t),{rng:A,url:t}}var b,P;return null},k=(e,n)=>{const{dom:o,selection:r}=e,{rng:a,url:s}=n,l=r.getBookmark();r.setRng(a);const c="createlink",u={command:c,ui:!1,value:s};if(!e.dispatch("BeforeExecCommand",u).isDefaultPrevented()){e.getDoc().execCommand(c,!1,s),e.dispatch("ExecCommand",u);const n=i(e);if(t(n)){const t=r.getNode();o.setAttrib(t,"target",n),"_blank"!==n||d(e)||o.setAttrib(t,"rel","noopener")}}r.moveToBookmark(l),e.nodeChanged()},p=e=>{const t=m(e,-1);o(t)&&k(e,t)},y=p;e.add("autolink",(e=>{(e=>{const t=e.options.register;t("autolink_pattern",{processor:"regexp",default:new RegExp("^"+/(?:[A-Za-z][A-Za-z\d.+-]{0,14}:\/\/(?:[-.~*+=!&;:'%@?^${}(),\w]+@)?|www\.|[-;:&=+$,.\w]+@)[A-Za-z\d-]+(?:\.[A-Za-z\d-]+)*(?::\d+)?(?:\/(?:[-.~*+=!;:'%@$(),\/\w]*[-~*+=%@$()\/\w])?)?(?:\?(?:[-.~*+=!&;:'%@?^${}(),\/\w]+))?(?:#(?:[-.~*+=!&;:'%@?^${}(),\/\w]+))?/g.source+"$","i")}),t("link_default_target",{processor:"string"}),t("link_default_protocol",{processor:"string",default:"https"})})(e),(e=>{e.on("keydown",(t=>{13!==t.keyCode||t.isDefaultPrevented()||(e=>{const t=m(e,0);o(t)&&k(e,t)})(e)})),e.on("keyup",(t=>{32===t.keyCode?p(e):(48===t.keyCode&&t.shiftKey||221===t.keyCode)&&y(e)}))})(e)}))}(); \ No newline at end of file +!function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager");const t=e=>"string"===(e=>{const t=typeof e;return null===e?"null":"object"===t&&Array.isArray(e)?"array":"object"===t&&(n=o=e,(r=String).prototype.isPrototypeOf(n)||o.constructor?.name===r.name)?"string":t;var n,o,r})(e);const n=e=>void 0===e;const o=e=>!(e=>null==e)(e),r=Object.hasOwnProperty,a=e=>"\ufeff"===e,s=e=>t=>t.options.get(e),l=s("autolink_pattern"),c=s("link_default_target"),i=s("link_default_protocol"),d=s("allow_unsafe_link_target");var u=tinymce.util.Tools.resolve("tinymce.dom.TextSeeker");const f=e=>3===e.nodeType,g=e=>1===e.nodeType,m=e=>/^[(\[{ \u00a0]$/.test(e),k=(e,t,n)=>{for(let o=t-1;o>=0;o--){const t=e.charAt(o);if(!a(t)&&n(t))return o}return-1},p=(e,t)=>{const o=e.schema.getVoidElements(),a=l(e),{dom:s,selection:c}=e;if(null!==s.getParent(c.getNode(),"a[href]")||e.mode.isReadOnly())return null;const d=c.getRng(),p=u(s,e=>{return s.isBlock(e)||(t=o,n=e.nodeName.toLowerCase(),r.call(t,n))||"false"===s.getContentEditable(e)||null!==s.getParent(e,"a[href]");var t,n}),{container:y,offset:w}=((e,t)=>{let n=e,o=t;for(;g(n)&&n.childNodes[o];)n=n.childNodes[o],o=f(n)?n.data.length:n.childNodes.length;return{container:n,offset:o}})(d.endContainer,d.endOffset),h=s.getParent(y,s.isBlock)??s.getRoot(),_=p.backwards(y,w+t,(e,t)=>{const n=e.data,o=k(n,t,(r=m,e=>!r(e)));var r,a;return-1===o||(a=n[o],/[?!,.;:]/.test(a))?o:o+1},h);if(!_)return null;let v=_.container;const A=p.backwards(_.container,_.offset,(e,t)=>{v=e;const n=k(e.data,t,m);return-1===n?n:n+1},h),C=s.createRng();A?C.setStart(A.container,A.offset):C.setStart(v,0),C.setEnd(_.container,_.offset);const b=C.toString().replace(/\uFEFF/g,"").match(a);if(b){let t=b[0];return $="www.",(P=t).length>=4&&P.substr(0,4)===$?t=i(e)+"://"+t:((e,t,o=0,r)=>{const a=e.indexOf(t,o);return-1!==a&&(!!n(r)||a+t.length<=r)})(t,"@")&&!(e=>/^([A-Za-z][A-Za-z\d.+-]*:\/\/)|mailto:/.test(e))(t)&&(t="mailto:"+t),{rng:C,url:t}}var P,$;return null},y=(e,n)=>{const{dom:o,selection:r}=e,{rng:a,url:s}=n,l=r.getBookmark();r.setRng(a);const i="createlink",u={command:i,ui:!1,value:s};if(!e.dispatch("BeforeExecCommand",u).isDefaultPrevented()){e.getDoc().execCommand(i,!1,s),e.dispatch("ExecCommand",u);const n=c(e);if(t(n)){const t=r.getNode();o.setAttrib(t,"target",n),"_blank"!==n||d(e)||o.setAttrib(t,"rel","noopener")}}r.moveToBookmark(l),e.nodeChanged()},w=e=>{const t=p(e,-1);o(t)&&y(e,t)},h=w,_="autolink";e.add(_,e=>((e=>{const t=e.options.register;t("autolink_pattern",{processor:"regexp",default:new RegExp("^"+/(?:[A-Za-z][A-Za-z\d.+-]{0,14}:\/\/(?:[-.~*+=!&;:'%@?^${}(),\w]+@)?|www\.|[-;:&=+$,.\w]+@)[A-Za-z\d-]+(?:\.[A-Za-z\d-]+)*(?::\d+)?(?:\/(?:[-.~*+=!;:'%@$(),\/\w]*[-~*+=%@$()\/\w])?)?(?:\?(?:[-.~*+=!&;:'%@?^${}(),\/\w]+))?(?:#(?:[-.~*+=!&;:'%@?^${}(),\/\w]+))?/g.source+"$","i")}),t("link_default_target",{processor:"string"}),t("link_default_protocol",{processor:"string",default:"https"})})(e),(e=>{e.on("keydown",t=>{13!==t.keyCode||t.isDefaultPrevented()||(e=>{const t=p(e,0);o(t)&&y(e,t)})(e)}),e.on("keyup",t=>{32===t.keyCode?w(e):(48===t.keyCode&&t.shiftKey||221===t.keyCode)&&h(e)})})(e),{getMetadata:()=>({name:"Autolink",type:"opensource",slug:_})}))}(); \ No newline at end of file diff --git a/public/assets/tinymce/plugins/autoresize/plugin.js b/public/assets/tinymce/plugins/autoresize/plugin.js index d8e81f961..a3a122f7f 100644 --- a/public/assets/tinymce/plugins/autoresize/plugin.js +++ b/public/assets/tinymce/plugins/autoresize/plugin.js @@ -1,5 +1,5 @@ /** - * TinyMCE version 8.1.2 (TBD) + * TinyMCE version 8.10.0 (2026-10-14) */ (function () { @@ -59,8 +59,7 @@ } }; const parseCssValueToInt = (dom, elm, name, computed) => { - var _a; - const value = parseInt((_a = dom.getStyle(elm, name, computed)) !== null && _a !== void 0 ? _a : '', 10); + const value = parseInt(dom.getStyle(elm, name, computed) ?? '', 10); // The value maybe be an empty string, so in that case treat it as being 0 return isNaN(value) ? 0 : value; }; @@ -68,7 +67,7 @@ // Only scroll the selection into view when we're inserting content. Any other // triggers the selection should already be in view and resizing would only // extend the content area. - if ((trigger === null || trigger === void 0 ? void 0 : trigger.type.toLowerCase()) === 'setcontent') { + if (trigger?.type.toLowerCase() === 'setcontent') { const setContentEvent = trigger; return setContentEvent.selection === true || setContentEvent.paste === true; } @@ -80,7 +79,6 @@ * This method gets executed each time the editor needs to resize. */ const resize = (editor, oldSize, trigger, getExtraMarginBottom) => { - var _a; const dom = editor.dom; const doc = editor.getDoc(); if (!doc) { @@ -92,7 +90,7 @@ } const docEle = doc.documentElement; const resizeBottomMargin = getExtraMarginBottom ? getExtraMarginBottom() : getAutoResizeOverflowPadding(editor); - const minHeight = (_a = getMinHeight(editor)) !== null && _a !== void 0 ? _a : editor.getElement().offsetHeight; + const minHeight = getMinHeight(editor) ?? editor.getElement().offsetHeight; let resizeHeight = minHeight; // Calculate outer height of the doc element using CSS styles const marginTop = parseCssValueToInt(dom, docEle, 'margin-top', true); @@ -193,8 +191,9 @@ * @class tinymce.autoresize.Plugin * @private */ + const PLUGIN_CODE = 'autoresize'; var Plugin = () => { - global$1.add('autoresize', (editor) => { + global$1.add(PLUGIN_CODE, (editor) => { register$1(editor); // If autoresize is enabled, disable resize if the user hasn't explicitly enabled it // TINY-8288: This currently does nothing because of a bug in the theme @@ -210,6 +209,9 @@ register(editor, oldSize); setup(editor, oldSize); } + return { + getMetadata: () => ({ name: 'Autoresize', type: 'opensource', slug: PLUGIN_CODE }) + }; }); }; diff --git a/public/assets/tinymce/plugins/autoresize/plugin.min.js b/public/assets/tinymce/plugins/autoresize/plugin.min.js index 654d63fd0..32df1d0a8 100644 --- a/public/assets/tinymce/plugins/autoresize/plugin.min.js +++ b/public/assets/tinymce/plugins/autoresize/plugin.min.js @@ -1 +1 @@ -!function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager"),t=tinymce.util.Tools.resolve("tinymce.Env");const o=e=>t=>t.options.get(e),n=o("min_height"),s=o("max_height"),i=o("autoresize_overflow_padding"),r=o("autoresize_bottom_margin"),g=(e,t)=>{const o=e.getBody();o&&(o.style.overflowY=t?"":"hidden",t||(o.scrollTop=0))},l=(e,t,o,n)=>{var s;const i=parseInt(null!==(s=e.getStyle(t,o,n))&&void 0!==s?s:"",10);return isNaN(i)?0:i},a=(e,o,r,c)=>{var d;const u=e.dom,h=e.getDoc();if(!h)return;if((e=>e.plugins.fullscreen&&e.plugins.fullscreen.isFullscreen())(e))return void g(e,!0);const m=h.documentElement,f=c?c():i(e),p=null!==(d=n(e))&&void 0!==d?d:e.getElement().offsetHeight;let y=p;const S=l(u,m,"margin-top",!0),v=l(u,m,"margin-bottom",!0);let C=m.offsetHeight+S+v+f;C<0&&(C=0);const H=e.getContainer().offsetHeight-e.getContentAreaContainer().offsetHeight;C+H>p&&(y=C+H);const b=s(e);b&&y>b?(y=b,g(e,!0)):g(e,!1);const w=o.get();if(w.set&&(e.dom.setStyles(e.getDoc().documentElement,{"min-height":0}),e.dom.setStyles(e.getBody(),{"min-height":"inherit"})),y!==w.totalHeight&&(C-f!==w.contentHeight||!w.set)){const n=y-w.totalHeight;if(u.setStyle(e.getContainer(),"height",y+"px"),o.set({totalHeight:y,contentHeight:C,set:!0}),(e=>{e.dispatch("ResizeEditor")})(e),t.browser.isSafari()&&(t.os.isMacOS()||t.os.isiOS())){const t=e.getWin();t.scrollTo(t.pageXOffset,t.pageYOffset)}e.hasFocus()&&(e=>{if("setcontent"===(null==e?void 0:e.type.toLowerCase())){const t=e;return!0===t.selection||!0===t.paste}return!1})(r)&&e.selection.scrollIntoView(),(t.browser.isSafari()||t.browser.isChromium())&&n<0&&a(e,o,r,c)}};e.add("autoresize",(e=>{if((e=>{const t=e.options.register;t("autoresize_overflow_padding",{processor:"number",default:1}),t("autoresize_bottom_margin",{processor:"number",default:50})})(e),e.options.isSet("resize")||e.options.set("resize",!1),!e.inline){const o=(()=>{let e={totalHeight:0,contentHeight:0,set:!1};return{get:()=>e,set:t=>{e=t}}})();((e,t)=>{e.addCommand("mceAutoResize",(()=>{a(e,t)}))})(e,o),((e,o)=>{const n=()=>r(e);e.on("init",(s=>{const r=i(e),g=e.dom;g.setStyles(e.getDoc().documentElement,{height:"auto"}),t.browser.isEdge()||t.browser.isIE()?g.setStyles(e.getBody(),{paddingLeft:r,paddingRight:r,"min-height":0}):g.setStyles(e.getBody(),{paddingLeft:r,paddingRight:r}),a(e,o,s,n)})),e.on("NodeChange SetContent keyup FullscreenStateChanged ResizeContent",(t=>{a(e,o,t,n)}))})(e,o)}}))}(); \ No newline at end of file +!function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager"),t=tinymce.util.Tools.resolve("tinymce.Env");const o=e=>t=>t.options.get(e),s=o("min_height"),n=o("max_height"),i=o("autoresize_overflow_padding"),r=o("autoresize_bottom_margin"),g=(e,t)=>{const o=e.getBody();o&&(o.style.overflowY=t?"":"hidden",t||(o.scrollTop=0))},a=(e,t,o,s)=>{const n=parseInt(e.getStyle(t,o,s)??"",10);return isNaN(n)?0:n},l=(e,o,r,c)=>{const d=e.dom,u=e.getDoc();if(!u)return;if((e=>e.plugins.fullscreen&&e.plugins.fullscreen.isFullscreen())(e))return void g(e,!0);const m=u.documentElement,h=c?c():i(e),f=s(e)??e.getElement().offsetHeight;let p=f;const y=a(d,m,"margin-top",!0),S=a(d,m,"margin-bottom",!0);let z=m.offsetHeight+y+S+h;z<0&&(z=0);const C=e.getContainer().offsetHeight-e.getContentAreaContainer().offsetHeight;z+C>f&&(p=z+C);const H=n(e);H&&p>H?(p=H,g(e,!0)):g(e,!1);const b=o.get();if(b.set&&(e.dom.setStyles(e.getDoc().documentElement,{"min-height":0}),e.dom.setStyles(e.getBody(),{"min-height":"inherit"})),p!==b.totalHeight&&(z-h!==b.contentHeight||!b.set)){const s=p-b.totalHeight;if(d.setStyle(e.getContainer(),"height",p+"px"),o.set({totalHeight:p,contentHeight:z,set:!0}),(e=>{e.dispatch("ResizeEditor")})(e),t.browser.isSafari()&&(t.os.isMacOS()||t.os.isiOS())){const t=e.getWin();t.scrollTo(t.pageXOffset,t.pageYOffset)}e.hasFocus()&&(e=>{if("setcontent"===e?.type.toLowerCase()){const t=e;return!0===t.selection||!0===t.paste}return!1})(r)&&e.selection.scrollIntoView(),(t.browser.isSafari()||t.browser.isChromium())&&s<0&&l(e,o,r,c)}},c="autoresize";e.add(c,e=>{if((e=>{const t=e.options.register;t("autoresize_overflow_padding",{processor:"number",default:1}),t("autoresize_bottom_margin",{processor:"number",default:50})})(e),e.options.isSet("resize")||e.options.set("resize",!1),!e.inline){const o=(()=>{let e={totalHeight:0,contentHeight:0,set:!1};return{get:()=>e,set:t=>{e=t}}})();((e,t)=>{e.addCommand("mceAutoResize",()=>{l(e,t)})})(e,o),((e,o)=>{const s=()=>r(e);e.on("init",n=>{const r=i(e),g=e.dom;g.setStyles(e.getDoc().documentElement,{height:"auto"}),t.browser.isEdge()||t.browser.isIE()?g.setStyles(e.getBody(),{paddingLeft:r,paddingRight:r,"min-height":0}):g.setStyles(e.getBody(),{paddingLeft:r,paddingRight:r}),l(e,o,n,s)}),e.on("NodeChange SetContent keyup FullscreenStateChanged ResizeContent",t=>{l(e,o,t,s)})})(e,o)}return{getMetadata:()=>({name:"Autoresize",type:"opensource",slug:c})}})}(); \ No newline at end of file diff --git a/public/assets/tinymce/plugins/autosave/plugin.js b/public/assets/tinymce/plugins/autosave/plugin.js index c51cc858e..7a2dfc9c9 100644 --- a/public/assets/tinymce/plugins/autosave/plugin.js +++ b/public/assets/tinymce/plugins/autosave/plugin.js @@ -1,5 +1,5 @@ /** - * TinyMCE version 8.1.2 (TBD) + * TinyMCE version 8.10.0 (2026-10-14) */ (function () { @@ -9,13 +9,12 @@ /* eslint-disable @typescript-eslint/no-wrapper-object-types */ const hasProto = (v, constructor, predicate) => { - var _a; if (predicate(v, constructor.prototype)) { return true; } else { // String-based fallback time - return ((_a = v.constructor) === null || _a === void 0 ? void 0 : _a.name) === constructor.name; + return v.constructor?.name === constructor.name; } }; const typeOf = (x) => { @@ -118,8 +117,7 @@ } }; const hasDraft = (editor) => { - var _a; - const time = parseInt((_a = global$2.getItem(getAutoSavePrefix(editor) + 'time')) !== null && _a !== void 0 ? _a : '0', 10) || 0; + const time = parseInt(global$2.getItem(getAutoSavePrefix(editor) + 'time') ?? '0', 10) || 0; if (new Date().getTime() - time > getAutoSaveRetention(editor)) { removeDraft(editor, false); return false; @@ -143,10 +141,9 @@ } }; const restoreDraft = (editor) => { - var _a; const prefix = getAutoSavePrefix(editor); if (hasDraft(editor)) { - editor.setContent((_a = global$2.getItem(prefix + 'draft')) !== null && _a !== void 0 ? _a : '', { format: 'raw' }); + editor.setContent(global$2.getItem(prefix + 'draft') ?? '', { format: 'raw' }); fireRestoreDraft(editor); } }; @@ -228,8 +225,9 @@ * @class tinymce.autosave.Plugin * @private */ + const PLUGIN_CODE = 'autosave'; var Plugin = () => { - global$4.add('autosave', (editor) => { + global$4.add(PLUGIN_CODE, (editor) => { register$1(editor); setup(editor); register(editor); @@ -238,7 +236,10 @@ restoreDraft(editor); } }); - return get(editor); + return { + ...get(editor), + getMetadata: () => ({ name: 'Autosave', type: 'opensource', slug: PLUGIN_CODE }) + }; }); }; diff --git a/public/assets/tinymce/plugins/autosave/plugin.min.js b/public/assets/tinymce/plugins/autosave/plugin.min.js index 4f4235a47..6a3ce37df 100644 --- a/public/assets/tinymce/plugins/autosave/plugin.min.js +++ b/public/assets/tinymce/plugins/autosave/plugin.min.js @@ -1 +1 @@ -!function(){"use strict";var t=tinymce.util.Tools.resolve("tinymce.PluginManager");const e=t=>"string"===(t=>{const e=typeof t;return null===t?"null":"object"===e&&Array.isArray(t)?"array":"object"===e&&(r=o=t,(a=String).prototype.isPrototypeOf(r)||(null===(s=o.constructor)||void 0===s?void 0:s.name)===a.name)?"string":e;var r,o,a,s})(t);const r=t=>undefined===t;var o=tinymce.util.Tools.resolve("tinymce.util.Delay"),a=tinymce.util.Tools.resolve("tinymce.util.LocalStorage"),s=tinymce.util.Tools.resolve("tinymce.util.Tools");const n=t=>{const e=/^(\d+)([ms]?)$/.exec(t);return(e&&e[2]?{s:1e3,m:6e4}[e[2]]:1)*parseInt(t,10)},i=t=>e=>e.options.get(t),u=i("autosave_ask_before_unload"),l=i("autosave_restore_when_empty"),c=i("autosave_interval"),d=i("autosave_retention"),m=t=>{const e=document.location;return t.options.get("autosave_prefix").replace(/{path}/g,e.pathname).replace(/{query}/g,e.search).replace(/{hash}/g,e.hash).replace(/{id}/g,t.id)},v=(t,e)=>{if(r(e))return t.dom.isEmpty(t.getBody());{const r=s.trim(e);if(""===r)return!0;{const e=(new DOMParser).parseFromString(r,"text/html");return t.dom.isEmpty(e)}}},f=t=>{var e;const r=parseInt(null!==(e=a.getItem(m(t)+"time"))&&void 0!==e?e:"0",10)||0;return!((new Date).getTime()-r>d(t)&&(p(t,!1),1))},p=(t,e)=>{const r=m(t);a.removeItem(r+"draft"),a.removeItem(r+"time"),!1!==e&&(t=>{t.dispatch("RemoveDraft")})(t)},y=t=>{const e=m(t);!v(t)&&t.isDirty()&&(a.setItem(e+"draft",t.getContent({format:"raw",no_events:!0})),a.setItem(e+"time",(new Date).getTime().toString()),(t=>{t.dispatch("StoreDraft")})(t))},g=t=>{var e;const r=m(t);f(t)&&(t.setContent(null!==(e=a.getItem(r+"draft"))&&void 0!==e?e:"",{format:"raw"}),(t=>{t.dispatch("RestoreDraft")})(t))};var D=tinymce.util.Tools.resolve("tinymce.EditorManager");const h=t=>e=>{const r=()=>f(t)&&!t.mode.isReadOnly();e.setEnabled(r());const o=()=>e.setEnabled(r());return t.on("StoreDraft RestoreDraft RemoveDraft",o),()=>t.off("StoreDraft RestoreDraft RemoveDraft",o)};t.add("autosave",(t=>((t=>{const r=t.options.register,o=t=>{const r=e(t);return r?{value:n(t),valid:r}:{valid:!1,message:"Must be a string."}};r("autosave_ask_before_unload",{processor:"boolean",default:!0}),r("autosave_prefix",{processor:"string",default:"tinymce-autosave-{path}{query}{hash}-{id}-"}),r("autosave_restore_when_empty",{processor:"boolean",default:!1}),r("autosave_interval",{processor:o,default:"30s"}),r("autosave_retention",{processor:o,default:"20m"})})(t),(t=>{t.editorManager.on("BeforeUnload",(t=>{let e;s.each(D.get(),(t=>{t.plugins.autosave&&t.plugins.autosave.storeDraft(),!e&&t.isDirty()&&u(t)&&(e=t.translate("You have unsaved changes are you sure you want to navigate away?"))})),e&&(t.preventDefault(),t.returnValue=e)}))})(t),(t=>{(t=>{const e=c(t);o.setEditorInterval(t,(()=>{y(t)}),e)})(t);const e=()=>{(t=>{t.undoManager.transact((()=>{g(t),p(t)})),t.focus()})(t)};t.ui.registry.addButton("restoredraft",{tooltip:"Restore last draft",icon:"restore-draft",onAction:e,onSetup:h(t)}),t.ui.registry.addMenuItem("restoredraft",{text:"Restore last draft",icon:"restore-draft",onAction:e,onSetup:h(t)})})(t),t.on("init",(()=>{l(t)&&t.dom.isEmpty(t.getBody())&&g(t)})),(t=>({hasDraft:()=>f(t),storeDraft:()=>y(t),restoreDraft:()=>g(t),removeDraft:e=>p(t,e),isEmpty:e=>v(t,e)}))(t))))}(); \ No newline at end of file +!function(){"use strict";var t=tinymce.util.Tools.resolve("tinymce.PluginManager");const e=t=>"string"===(t=>{const e=typeof t;return null===t?"null":"object"===e&&Array.isArray(t)?"array":"object"===e&&(o=r=t,(a=String).prototype.isPrototypeOf(o)||r.constructor?.name===a.name)?"string":e;var o,r,a})(t);const o=t=>void 0===t;var r=tinymce.util.Tools.resolve("tinymce.util.Delay"),a=tinymce.util.Tools.resolve("tinymce.util.LocalStorage"),s=tinymce.util.Tools.resolve("tinymce.util.Tools");const n=t=>{const e=/^(\d+)([ms]?)$/.exec(t);return(e&&e[2]?{s:1e3,m:6e4}[e[2]]:1)*parseInt(t,10)},i=t=>e=>e.options.get(t),u=i("autosave_ask_before_unload"),c=i("autosave_restore_when_empty"),l=i("autosave_interval"),m=i("autosave_retention"),d=t=>{const e=document.location;return t.options.get("autosave_prefix").replace(/{path}/g,e.pathname).replace(/{query}/g,e.search).replace(/{hash}/g,e.hash).replace(/{id}/g,t.id)},f=(t,e)=>{if(o(e))return t.dom.isEmpty(t.getBody());{const o=s.trim(e);if(""===o)return!0;{const e=(new DOMParser).parseFromString(o,"text/html");return t.dom.isEmpty(e)}}},v=t=>{const e=parseInt(a.getItem(d(t)+"time")??"0",10)||0;return!((new Date).getTime()-e>m(t)&&(p(t,!1),1))},p=(t,e)=>{const o=d(t);a.removeItem(o+"draft"),a.removeItem(o+"time"),!1!==e&&(t=>{t.dispatch("RemoveDraft")})(t)},g=t=>{const e=d(t);!f(t)&&t.isDirty()&&(a.setItem(e+"draft",t.getContent({format:"raw",no_events:!0})),a.setItem(e+"time",(new Date).getTime().toString()),(t=>{t.dispatch("StoreDraft")})(t))},y=t=>{const e=d(t);v(t)&&(t.setContent(a.getItem(e+"draft")??"",{format:"raw"}),(t=>{t.dispatch("RestoreDraft")})(t))},D=t=>({hasDraft:()=>v(t),storeDraft:()=>g(t),restoreDraft:()=>y(t),removeDraft:e=>p(t,e),isEmpty:e=>f(t,e)});var h=tinymce.util.Tools.resolve("tinymce.EditorManager");const _=t=>e=>{const o=()=>v(t)&&!t.mode.isReadOnly();e.setEnabled(o());const r=()=>e.setEnabled(o());return t.on("StoreDraft RestoreDraft RemoveDraft",r),()=>t.off("StoreDraft RestoreDraft RemoveDraft",r)},I="autosave";t.add(I,t=>((t=>{const o=t.options.register,r=t=>{const o=e(t);return o?{value:n(t),valid:o}:{valid:!1,message:"Must be a string."}};o("autosave_ask_before_unload",{processor:"boolean",default:!0}),o("autosave_prefix",{processor:"string",default:"tinymce-autosave-{path}{query}{hash}-{id}-"}),o("autosave_restore_when_empty",{processor:"boolean",default:!1}),o("autosave_interval",{processor:r,default:"30s"}),o("autosave_retention",{processor:r,default:"20m"})})(t),(t=>{t.editorManager.on("BeforeUnload",t=>{let e;s.each(h.get(),t=>{t.plugins.autosave&&t.plugins.autosave.storeDraft(),!e&&t.isDirty()&&u(t)&&(e=t.translate("You have unsaved changes are you sure you want to navigate away?"))}),e&&(t.preventDefault(),t.returnValue=e)})})(t),(t=>{(t=>{const e=l(t);r.setEditorInterval(t,()=>{g(t)},e)})(t);const e=()=>{(t=>{t.undoManager.transact(()=>{y(t),p(t)}),t.focus()})(t)};t.ui.registry.addButton("restoredraft",{tooltip:"Restore last draft",icon:"restore-draft",onAction:e,onSetup:_(t)}),t.ui.registry.addMenuItem("restoredraft",{text:"Restore last draft",icon:"restore-draft",onAction:e,onSetup:_(t)})})(t),t.on("init",()=>{c(t)&&t.dom.isEmpty(t.getBody())&&y(t)}),{...D(t),getMetadata:()=>({name:"Autosave",type:"opensource",slug:I})}))}(); \ No newline at end of file diff --git a/public/assets/tinymce/plugins/charmap/plugin.js b/public/assets/tinymce/plugins/charmap/plugin.js index cf749ce67..ea96a3468 100644 --- a/public/assets/tinymce/plugins/charmap/plugin.js +++ b/public/assets/tinymce/plugins/charmap/plugin.js @@ -1,5 +1,5 @@ /** - * TinyMCE version 8.1.2 (TBD) + * TinyMCE version 8.10.0 (2026-10-14) */ (function () { @@ -18,13 +18,12 @@ /* eslint-disable @typescript-eslint/no-wrapper-object-types */ const hasProto = (v, constructor, predicate) => { - var _a; if (predicate(v, constructor.prototype)) { return true; } else { // String-based fallback time - return ((_a = v.constructor) === null || _a === void 0 ? void 0 : _a.name) === constructor.name; + return v.constructor?.name === constructor.name; } }; const typeOf = (x) => { @@ -75,6 +74,11 @@ * strict-null-checks */ class Optional { + tag; + value; + // Sneaky optimisation: every instance of Optional.none is identical, so just + // reuse the same object + static singletonNone = new Optional(false); // The internal representation has a `tag` and a `value`, but both are // private: able to be console.logged, but not able to be accessed by code constructor(tag, value) { @@ -242,7 +246,7 @@ */ getOrDie(message) { if (!this.tag) { - throw new Error(message !== null && message !== void 0 ? message : 'Called getOrDie on None'); + throw new Error(message ?? 'Called getOrDie on None'); } else { return this.value; @@ -306,9 +310,6 @@ return this.tag ? `some(${this.value})` : 'none()'; } } - // Sneaky optimisation: every instance of Optional.none is identical, so just - // reuse the same object - Optional.singletonNone = new Optional(false); const nativeSlice = Array.prototype.slice; const nativePush = Array.prototype.push; @@ -975,14 +976,18 @@ }); }; + const PLUGIN_CODE = 'charmap'; var Plugin = () => { - global$1.add('charmap', (editor) => { + global$1.add(PLUGIN_CODE, (editor) => { register$2(editor); const charMap = getCharMap(editor); register$1(editor, charMap); register(editor); init(editor, charMap[0]); - return get(editor); + return { + ...get(editor), + getMetadata: () => ({ name: 'Character Map', type: 'opensource', slug: PLUGIN_CODE }) + }; }); }; diff --git a/public/assets/tinymce/plugins/charmap/plugin.min.js b/public/assets/tinymce/plugins/charmap/plugin.min.js index 4bc150de7..7811288de 100644 --- a/public/assets/tinymce/plugins/charmap/plugin.min.js +++ b/public/assets/tinymce/plugins/charmap/plugin.min.js @@ -1 +1 @@ -!function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager");const t=(e,t)=>{const r=((e,t)=>e.dispatch("insertCustomChar",{chr:t}))(e,t).chr;e.execCommand("mceInsertContent",!1,r)},r=e=>t=>e===t,a=e=>"array"===(e=>{const t=typeof e;return null===e?"null":"object"===t&&Array.isArray(e)?"array":"object"===t&&(r=a=e,(n=String).prototype.isPrototypeOf(r)||(null===(i=a.constructor)||void 0===i?void 0:i.name)===n.name)?"string":t;var r,a,n,i})(e);const n=r(null),i=r(void 0),o=e=>"function"==typeof e,s=()=>false;class l{constructor(e,t){this.tag=e,this.value=t}static some(e){return new l(!0,e)}static none(){return l.singletonNone}fold(e,t){return this.tag?t(this.value):e()}isSome(){return this.tag}isNone(){return!this.tag}map(e){return this.tag?l.some(e(this.value)):l.none()}bind(e){return this.tag?e(this.value):l.none()}exists(e){return this.tag&&e(this.value)}forall(e){return!this.tag||e(this.value)}filter(e){return!this.tag||e(this.value)?this:l.none()}getOr(e){return this.tag?this.value:e}or(e){return this.tag?this:e}getOrThunk(e){return this.tag?this.value:e()}orThunk(e){return this.tag?this:e()}getOrDie(e){if(this.tag)return this.value;throw new Error(null!=e?e:"Called getOrDie on None")}static from(e){return null==e?l.none():l.some(e)}getOrNull(){return this.tag?this.value:null}getOrUndefined(){return this.value}each(e){this.tag&&e(this.value)}toArray(){return this.tag?[this.value]:[]}toString(){return this.tag?`some(${this.value})`:"none()"}}l.singletonNone=new l(!1),Array.prototype.slice;const c=Array.prototype.push,u=(e,t)=>{const r=e.length,a=new Array(r);for(let n=0;n{let t=e;return{get:()=>t,set:e=>{t=e}}},h=(e,t,r=0,a)=>{const n=e.indexOf(t,r);return-1!==n&&(!!i(a)||n+t.length<=a)},m=String.fromCodePoint;var p=tinymce.util.Tools.resolve("tinymce.util.Tools");const d=e=>t=>t.options.get(e),f=d("charmap"),y=d("charmap_append"),b=p.isArray,w="User Defined",v=e=>{return b(e)?(t=e,p.grep(t,(e=>b(e)&&2===e.length))):"function"==typeof e?e():[];var t},k=e=>{const t=((e,t)=>{const r=f(e);r&&(t=[{name:w,characters:v(r)}]);const a=y(e);if(a){const e=p.grep(t,(e=>e.name===w));return e.length?(e[0].characters=[...e[0].characters,...v(a)],t):t.concat({name:w,characters:v(a)})}return t})(e,[{name:"Currency",characters:[[36,"dollar sign"],[162,"cent sign"],[8364,"euro sign"],[163,"pound sign"],[165,"yen sign"],[164,"currency sign"],[8352,"euro-currency sign"],[8353,"colon sign"],[8354,"cruzeiro sign"],[8355,"french franc sign"],[8356,"lira sign"],[8357,"mill sign"],[8358,"naira sign"],[8359,"peseta sign"],[8360,"rupee sign"],[8361,"won sign"],[8362,"new sheqel sign"],[8363,"dong sign"],[8365,"kip sign"],[8366,"tugrik sign"],[8367,"drachma sign"],[8368,"german penny symbol"],[8369,"peso sign"],[8370,"guarani sign"],[8371,"austral sign"],[8372,"hryvnia sign"],[8373,"cedi sign"],[8374,"livre tournois sign"],[8375,"spesmilo sign"],[8376,"tenge sign"],[8377,"indian rupee sign"],[8378,"turkish lira sign"],[8379,"nordic mark sign"],[8380,"manat sign"],[8381,"ruble sign"],[20870,"yen character"],[20803,"yuan character"],[22291,"yuan character, in hong kong and taiwan"],[22278,"yen/yuan character variant one"]]},{name:"Text",characters:[[169,"copyright sign"],[174,"registered sign"],[8482,"trade mark sign"],[8240,"per mille sign"],[181,"micro sign"],[183,"middle dot"],[8226,"bullet"],[8230,"three dot leader"],[8242,"minutes / feet"],[8243,"seconds / inches"],[167,"section sign"],[182,"paragraph sign"],[223,"sharp s / ess-zed"]]},{name:"Quotations",characters:[[8249,"single left-pointing angle quotation mark"],[8250,"single right-pointing angle quotation mark"],[171,"left pointing guillemet"],[187,"right pointing guillemet"],[8216,"left single quotation mark"],[8217,"right single quotation mark"],[8220,"left double quotation mark"],[8221,"right double quotation mark"],[8218,"single low-9 quotation mark"],[8222,"double low-9 quotation mark"],[60,"less-than sign"],[62,"greater-than sign"],[8804,"less-than or equal to"],[8805,"greater-than or equal to"],[8211,"en dash"],[8212,"em dash"],[175,"macron"],[8254,"overline"],[164,"currency sign"],[166,"broken bar"],[168,"diaeresis"],[161,"inverted exclamation mark"],[191,"turned question mark"],[710,"circumflex accent"],[732,"small tilde"],[176,"degree sign"],[8722,"minus sign"],[177,"plus-minus sign"],[247,"division sign"],[8260,"fraction slash"],[215,"multiplication sign"],[185,"superscript one"],[178,"superscript two"],[179,"superscript three"],[188,"fraction one quarter"],[189,"fraction one half"],[190,"fraction three quarters"]]},{name:"Mathematical",characters:[[402,"function / florin"],[8747,"integral"],[8721,"n-ary sumation"],[8734,"infinity"],[8730,"square root"],[8764,"similar to"],[8773,"approximately equal to"],[8776,"almost equal to"],[8800,"not equal to"],[8801,"identical to"],[8712,"element of"],[8713,"not an element of"],[8715,"contains as member"],[8719,"n-ary product"],[8743,"logical and"],[8744,"logical or"],[172,"not sign"],[8745,"intersection"],[8746,"union"],[8706,"partial differential"],[8704,"for all"],[8707,"there exists"],[8709,"diameter"],[8711,"backward difference"],[8727,"asterisk operator"],[8733,"proportional to"],[8736,"angle"]]},{name:"Extended Latin",characters:[[192,"A - grave"],[193,"A - acute"],[194,"A - circumflex"],[195,"A - tilde"],[196,"A - diaeresis"],[197,"A - ring above"],[256,"A - macron"],[198,"ligature AE"],[199,"C - cedilla"],[200,"E - grave"],[201,"E - acute"],[202,"E - circumflex"],[203,"E - diaeresis"],[274,"E - macron"],[204,"I - grave"],[205,"I - acute"],[206,"I - circumflex"],[207,"I - diaeresis"],[298,"I - macron"],[208,"ETH"],[209,"N - tilde"],[210,"O - grave"],[211,"O - acute"],[212,"O - circumflex"],[213,"O - tilde"],[214,"O - diaeresis"],[216,"O - slash"],[332,"O - macron"],[338,"ligature OE"],[352,"S - caron"],[217,"U - grave"],[218,"U - acute"],[219,"U - circumflex"],[220,"U - diaeresis"],[362,"U - macron"],[221,"Y - acute"],[376,"Y - diaeresis"],[562,"Y - macron"],[222,"THORN"],[224,"a - grave"],[225,"a - acute"],[226,"a - circumflex"],[227,"a - tilde"],[228,"a - diaeresis"],[229,"a - ring above"],[257,"a - macron"],[230,"ligature ae"],[231,"c - cedilla"],[232,"e - grave"],[233,"e - acute"],[234,"e - circumflex"],[235,"e - diaeresis"],[275,"e - macron"],[236,"i - grave"],[237,"i - acute"],[238,"i - circumflex"],[239,"i - diaeresis"],[299,"i - macron"],[240,"eth"],[241,"n - tilde"],[242,"o - grave"],[243,"o - acute"],[244,"o - circumflex"],[245,"o - tilde"],[246,"o - diaeresis"],[248,"o slash"],[333,"o macron"],[339,"ligature oe"],[353,"s - caron"],[249,"u - grave"],[250,"u - acute"],[251,"u - circumflex"],[252,"u - diaeresis"],[363,"u - macron"],[253,"y - acute"],[254,"thorn"],[255,"y - diaeresis"],[563,"y - macron"],[913,"Alpha"],[914,"Beta"],[915,"Gamma"],[916,"Delta"],[917,"Epsilon"],[918,"Zeta"],[919,"Eta"],[920,"Theta"],[921,"Iota"],[922,"Kappa"],[923,"Lambda"],[924,"Mu"],[925,"Nu"],[926,"Xi"],[927,"Omicron"],[928,"Pi"],[929,"Rho"],[931,"Sigma"],[932,"Tau"],[933,"Upsilon"],[934,"Phi"],[935,"Chi"],[936,"Psi"],[937,"Omega"],[945,"alpha"],[946,"beta"],[947,"gamma"],[948,"delta"],[949,"epsilon"],[950,"zeta"],[951,"eta"],[952,"theta"],[953,"iota"],[954,"kappa"],[955,"lambda"],[956,"mu"],[957,"nu"],[958,"xi"],[959,"omicron"],[960,"pi"],[961,"rho"],[962,"final sigma"],[963,"sigma"],[964,"tau"],[965,"upsilon"],[966,"phi"],[967,"chi"],[968,"psi"],[969,"omega"]]},{name:"Symbols",characters:[[8501,"alef symbol"],[982,"pi symbol"],[8476,"real part symbol"],[978,"upsilon - hook symbol"],[8472,"Weierstrass p"],[8465,"imaginary part"]]},{name:"Arrows",characters:[[8592,"leftwards arrow"],[8593,"upwards arrow"],[8594,"rightwards arrow"],[8595,"downwards arrow"],[8596,"left right arrow"],[8629,"carriage return"],[8656,"leftwards double arrow"],[8657,"upwards double arrow"],[8658,"rightwards double arrow"],[8659,"downwards double arrow"],[8660,"left right double arrow"],[8756,"therefore"],[8834,"subset of"],[8835,"superset of"],[8836,"not a subset of"],[8838,"subset of or equal to"],[8839,"superset of or equal to"],[8853,"circled plus"],[8855,"circled times"],[8869,"perpendicular"],[8901,"dot operator"],[8968,"left ceiling"],[8969,"right ceiling"],[8970,"left floor"],[8971,"right floor"],[9001,"left-pointing angle bracket"],[9002,"right-pointing angle bracket"],[9674,"lozenge"],[9824,"black spade suit"],[9827,"black club suit"],[9829,"black heart suit"],[9830,"black diamond suit"],[8194,"en space"],[8195,"em space"],[8201,"thin space"],[8204,"zero width non-joiner"],[8205,"zero width joiner"],[8206,"left-to-right mark"],[8207,"right-to-left mark"]]}]);return t.length>1?[{name:"All",characters:(r=t,n=e=>e.characters,(e=>{const t=[];for(let r=0,n=e.length;r{const r=[],a=t.toLowerCase();return(e=>{for(let n=0,i=e.length;n!!h(m(e).toLowerCase(),r)||h(t.toLowerCase(),r)||h(t.toLowerCase().replace(/\s+/g,""),r))((t=e[n])[0],t[1],a)&&r.push(t);var t})(e.characters),u(r,(e=>({text:e[1],value:m(e[0]),icon:m(e[0])})))},C="pattern",x=(e,r)=>{const a=()=>[{label:"Search",type:"input",name:C},{type:"collection",name:"results"}],i=1===r.length?g(w):g("All"),o=(e=>{let t=null;const r=()=>{n(t)||(clearTimeout(t),t=null)};return{cancel:r,throttle:(...a)=>{r(),t=setTimeout((()=>{t=null,e.apply(null,a)}),40)}}})((e=>{const t=e.getData().pattern;((e,t)=>{var a,n;(a=r,n=e=>e.name===i.get(),((e,t,r)=>{for(let a=0,n=e.length;a{const a=A(r,t);e.setData({results:a})}))})(e,t)})),c={title:"Special Character",size:"normal",body:1===r.length?{type:"panel",items:a()}:{type:"tabpanel",tabs:u(r,(e=>({title:e.name,name:e.name,items:a()})))},buttons:[{type:"cancel",name:"close",text:"Close",primary:!0}],initialData:{pattern:"",results:A(r[0],"")},onAction:(r,a)=>{"results"===a.name&&(t(e,a.value),r.close())},onTabChange:(e,t)=>{i.set(t.newTabName),o.throttle(e)},onChange:(e,t)=>{t.name===C&&o.throttle(e)}};e.windowManager.open(c).focus(C)},q=e=>t=>{const r=()=>{t.setEnabled(e.selection.isEditable())};return e.on("NodeChange",r),r(),()=>{e.off("NodeChange",r)}};e.add("charmap",(e=>{(e=>{const t=e.options.register,r=e=>o(e)||a(e);t("charmap",{processor:r}),t("charmap_append",{processor:r})})(e);const r=k(e);return((e,t)=>{e.addCommand("mceShowCharmap",(()=>{x(e,t)}))})(e,r),(e=>{const t=()=>e.execCommand("mceShowCharmap");e.ui.registry.addButton("charmap",{icon:"insert-character",tooltip:"Special character",onAction:t,onSetup:q(e)}),e.ui.registry.addMenuItem("charmap",{icon:"insert-character",text:"Special character...",onAction:t,onSetup:q(e)})})(e),((e,t)=>{e.ui.registry.addAutocompleter("charmap",{trigger:":",columns:"auto",minChars:2,fetch:(e,r)=>new Promise(((r,a)=>{r(A(t,e))})),onAction:(t,r,a)=>{e.selection.setRng(r),e.insertContent(a),t.hide()}})})(e,r[0]),(e=>({getCharMap:()=>k(e),insertChar:r=>{t(e,r)}}))(e)}))}(); \ No newline at end of file +!function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager");const t=(e,t)=>{const r=((e,t)=>e.dispatch("insertCustomChar",{chr:t}))(e,t).chr;e.execCommand("mceInsertContent",!1,r)},r=e=>t=>e===t,a=e=>"array"===(e=>{const t=typeof e;return null===e?"null":"object"===t&&Array.isArray(e)?"array":"object"===t&&(r=a=e,(n=String).prototype.isPrototypeOf(r)||a.constructor?.name===n.name)?"string":t;var r,a,n})(e);const n=r(null),i=r(void 0),o=e=>"function"==typeof e,s=()=>false;class l{tag;value;static singletonNone=new l(!1);constructor(e,t){this.tag=e,this.value=t}static some(e){return new l(!0,e)}static none(){return l.singletonNone}fold(e,t){return this.tag?t(this.value):e()}isSome(){return this.tag}isNone(){return!this.tag}map(e){return this.tag?l.some(e(this.value)):l.none()}bind(e){return this.tag?e(this.value):l.none()}exists(e){return this.tag&&e(this.value)}forall(e){return!this.tag||e(this.value)}filter(e){return!this.tag||e(this.value)?this:l.none()}getOr(e){return this.tag?this.value:e}or(e){return this.tag?this:e}getOrThunk(e){return this.tag?this.value:e()}orThunk(e){return this.tag?this:e()}getOrDie(e){if(this.tag)return this.value;throw new Error(e??"Called getOrDie on None")}static from(e){return null==e?l.none():l.some(e)}getOrNull(){return this.tag?this.value:null}getOrUndefined(){return this.value}each(e){this.tag&&e(this.value)}toArray(){return this.tag?[this.value]:[]}toString(){return this.tag?`some(${this.value})`:"none()"}}Array.prototype.slice;const c=Array.prototype.push,u=(e,t)=>{const r=e.length,a=new Array(r);for(let n=0;n{let t=e;return{get:()=>t,set:e=>{t=e}}},h=(e,t,r=0,a)=>{const n=e.indexOf(t,r);return-1!==n&&(!!i(a)||n+t.length<=a)},m=String.fromCodePoint;var p=tinymce.util.Tools.resolve("tinymce.util.Tools");const d=e=>t=>t.options.get(e),f=d("charmap"),y=d("charmap_append"),b=p.isArray,w="User Defined",v=e=>{return b(e)?(t=e,p.grep(t,e=>b(e)&&2===e.length)):"function"==typeof e?e():[];var t},k=e=>{const t=((e,t)=>{const r=f(e);r&&(t=[{name:w,characters:v(r)}]);const a=y(e);if(a){const e=p.grep(t,e=>e.name===w);return e.length?(e[0].characters=[...e[0].characters,...v(a)],t):t.concat({name:w,characters:v(a)})}return t})(e,[{name:"Currency",characters:[[36,"dollar sign"],[162,"cent sign"],[8364,"euro sign"],[163,"pound sign"],[165,"yen sign"],[164,"currency sign"],[8352,"euro-currency sign"],[8353,"colon sign"],[8354,"cruzeiro sign"],[8355,"french franc sign"],[8356,"lira sign"],[8357,"mill sign"],[8358,"naira sign"],[8359,"peseta sign"],[8360,"rupee sign"],[8361,"won sign"],[8362,"new sheqel sign"],[8363,"dong sign"],[8365,"kip sign"],[8366,"tugrik sign"],[8367,"drachma sign"],[8368,"german penny symbol"],[8369,"peso sign"],[8370,"guarani sign"],[8371,"austral sign"],[8372,"hryvnia sign"],[8373,"cedi sign"],[8374,"livre tournois sign"],[8375,"spesmilo sign"],[8376,"tenge sign"],[8377,"indian rupee sign"],[8378,"turkish lira sign"],[8379,"nordic mark sign"],[8380,"manat sign"],[8381,"ruble sign"],[20870,"yen character"],[20803,"yuan character"],[22291,"yuan character, in hong kong and taiwan"],[22278,"yen/yuan character variant one"]]},{name:"Text",characters:[[169,"copyright sign"],[174,"registered sign"],[8482,"trade mark sign"],[8240,"per mille sign"],[181,"micro sign"],[183,"middle dot"],[8226,"bullet"],[8230,"three dot leader"],[8242,"minutes / feet"],[8243,"seconds / inches"],[167,"section sign"],[182,"paragraph sign"],[223,"sharp s / ess-zed"]]},{name:"Quotations",characters:[[8249,"single left-pointing angle quotation mark"],[8250,"single right-pointing angle quotation mark"],[171,"left pointing guillemet"],[187,"right pointing guillemet"],[8216,"left single quotation mark"],[8217,"right single quotation mark"],[8220,"left double quotation mark"],[8221,"right double quotation mark"],[8218,"single low-9 quotation mark"],[8222,"double low-9 quotation mark"],[60,"less-than sign"],[62,"greater-than sign"],[8804,"less-than or equal to"],[8805,"greater-than or equal to"],[8211,"en dash"],[8212,"em dash"],[175,"macron"],[8254,"overline"],[164,"currency sign"],[166,"broken bar"],[168,"diaeresis"],[161,"inverted exclamation mark"],[191,"turned question mark"],[710,"circumflex accent"],[732,"small tilde"],[176,"degree sign"],[8722,"minus sign"],[177,"plus-minus sign"],[247,"division sign"],[8260,"fraction slash"],[215,"multiplication sign"],[185,"superscript one"],[178,"superscript two"],[179,"superscript three"],[188,"fraction one quarter"],[189,"fraction one half"],[190,"fraction three quarters"]]},{name:"Mathematical",characters:[[402,"function / florin"],[8747,"integral"],[8721,"n-ary sumation"],[8734,"infinity"],[8730,"square root"],[8764,"similar to"],[8773,"approximately equal to"],[8776,"almost equal to"],[8800,"not equal to"],[8801,"identical to"],[8712,"element of"],[8713,"not an element of"],[8715,"contains as member"],[8719,"n-ary product"],[8743,"logical and"],[8744,"logical or"],[172,"not sign"],[8745,"intersection"],[8746,"union"],[8706,"partial differential"],[8704,"for all"],[8707,"there exists"],[8709,"diameter"],[8711,"backward difference"],[8727,"asterisk operator"],[8733,"proportional to"],[8736,"angle"]]},{name:"Extended Latin",characters:[[192,"A - grave"],[193,"A - acute"],[194,"A - circumflex"],[195,"A - tilde"],[196,"A - diaeresis"],[197,"A - ring above"],[256,"A - macron"],[198,"ligature AE"],[199,"C - cedilla"],[200,"E - grave"],[201,"E - acute"],[202,"E - circumflex"],[203,"E - diaeresis"],[274,"E - macron"],[204,"I - grave"],[205,"I - acute"],[206,"I - circumflex"],[207,"I - diaeresis"],[298,"I - macron"],[208,"ETH"],[209,"N - tilde"],[210,"O - grave"],[211,"O - acute"],[212,"O - circumflex"],[213,"O - tilde"],[214,"O - diaeresis"],[216,"O - slash"],[332,"O - macron"],[338,"ligature OE"],[352,"S - caron"],[217,"U - grave"],[218,"U - acute"],[219,"U - circumflex"],[220,"U - diaeresis"],[362,"U - macron"],[221,"Y - acute"],[376,"Y - diaeresis"],[562,"Y - macron"],[222,"THORN"],[224,"a - grave"],[225,"a - acute"],[226,"a - circumflex"],[227,"a - tilde"],[228,"a - diaeresis"],[229,"a - ring above"],[257,"a - macron"],[230,"ligature ae"],[231,"c - cedilla"],[232,"e - grave"],[233,"e - acute"],[234,"e - circumflex"],[235,"e - diaeresis"],[275,"e - macron"],[236,"i - grave"],[237,"i - acute"],[238,"i - circumflex"],[239,"i - diaeresis"],[299,"i - macron"],[240,"eth"],[241,"n - tilde"],[242,"o - grave"],[243,"o - acute"],[244,"o - circumflex"],[245,"o - tilde"],[246,"o - diaeresis"],[248,"o slash"],[333,"o macron"],[339,"ligature oe"],[353,"s - caron"],[249,"u - grave"],[250,"u - acute"],[251,"u - circumflex"],[252,"u - diaeresis"],[363,"u - macron"],[253,"y - acute"],[254,"thorn"],[255,"y - diaeresis"],[563,"y - macron"],[913,"Alpha"],[914,"Beta"],[915,"Gamma"],[916,"Delta"],[917,"Epsilon"],[918,"Zeta"],[919,"Eta"],[920,"Theta"],[921,"Iota"],[922,"Kappa"],[923,"Lambda"],[924,"Mu"],[925,"Nu"],[926,"Xi"],[927,"Omicron"],[928,"Pi"],[929,"Rho"],[931,"Sigma"],[932,"Tau"],[933,"Upsilon"],[934,"Phi"],[935,"Chi"],[936,"Psi"],[937,"Omega"],[945,"alpha"],[946,"beta"],[947,"gamma"],[948,"delta"],[949,"epsilon"],[950,"zeta"],[951,"eta"],[952,"theta"],[953,"iota"],[954,"kappa"],[955,"lambda"],[956,"mu"],[957,"nu"],[958,"xi"],[959,"omicron"],[960,"pi"],[961,"rho"],[962,"final sigma"],[963,"sigma"],[964,"tau"],[965,"upsilon"],[966,"phi"],[967,"chi"],[968,"psi"],[969,"omega"]]},{name:"Symbols",characters:[[8501,"alef symbol"],[982,"pi symbol"],[8476,"real part symbol"],[978,"upsilon - hook symbol"],[8472,"Weierstrass p"],[8465,"imaginary part"]]},{name:"Arrows",characters:[[8592,"leftwards arrow"],[8593,"upwards arrow"],[8594,"rightwards arrow"],[8595,"downwards arrow"],[8596,"left right arrow"],[8629,"carriage return"],[8656,"leftwards double arrow"],[8657,"upwards double arrow"],[8658,"rightwards double arrow"],[8659,"downwards double arrow"],[8660,"left right double arrow"],[8756,"therefore"],[8834,"subset of"],[8835,"superset of"],[8836,"not a subset of"],[8838,"subset of or equal to"],[8839,"superset of or equal to"],[8853,"circled plus"],[8855,"circled times"],[8869,"perpendicular"],[8901,"dot operator"],[8968,"left ceiling"],[8969,"right ceiling"],[8970,"left floor"],[8971,"right floor"],[9001,"left-pointing angle bracket"],[9002,"right-pointing angle bracket"],[9674,"lozenge"],[9824,"black spade suit"],[9827,"black club suit"],[9829,"black heart suit"],[9830,"black diamond suit"],[8194,"en space"],[8195,"em space"],[8201,"thin space"],[8204,"zero width non-joiner"],[8205,"zero width joiner"],[8206,"left-to-right mark"],[8207,"right-to-left mark"]]}]);return t.length>1?[{name:"All",characters:(r=t,n=e=>e.characters,(e=>{const t=[];for(let r=0,n=e.length;r({getCharMap:()=>k(e),insertChar:r=>{t(e,r)}}),A=(e,t)=>{const r=[],a=t.toLowerCase();return((e,t)=>{for(let r=0,a=e.length;r{((e,t,r)=>!!h(m(e).toLowerCase(),r)||h(t.toLowerCase(),r)||h(t.toLowerCase().replace(/\s+/g,""),r))(e[0],e[1],a)&&r.push(e)}),u(r,e=>({text:e[1],value:m(e[0]),icon:m(e[0])}))},x="pattern",q=(e,r)=>{const a=()=>[{label:"Search",type:"input",name:x},{type:"collection",name:"results"}],i=1===r.length?g(w):g("All"),o=(e=>{let t=null;const r=()=>{n(t)||(clearTimeout(t),t=null)};return{cancel:r,throttle:(...a)=>{r(),t=setTimeout(()=>{t=null,e.apply(null,a)},40)}}})(e=>{const t=e.getData().pattern;((e,t)=>{var a,n;(a=r,n=e=>e.name===i.get(),((e,t,r)=>{for(let a=0,n=e.length;a{const a=A(r,t);e.setData({results:a})})})(e,t)}),c={title:"Special Character",size:"normal",body:1===r.length?{type:"panel",items:a()}:{type:"tabpanel",tabs:u(r,e=>({title:e.name,name:e.name,items:a()}))},buttons:[{type:"cancel",name:"close",text:"Close",primary:!0}],initialData:{pattern:"",results:A(r[0],"")},onAction:(r,a)=>{"results"===a.name&&(t(e,a.value),r.close())},onTabChange:(e,t)=>{i.set(t.newTabName),o.throttle(e)},onChange:(e,t)=>{t.name===x&&o.throttle(e)}};e.windowManager.open(c).focus(x)},O=e=>t=>{const r=()=>{t.setEnabled(e.selection.isEditable())};return e.on("NodeChange",r),r(),()=>{e.off("NodeChange",r)}},E="charmap";e.add(E,e=>{(e=>{const t=e.options.register,r=e=>o(e)||a(e);t("charmap",{processor:r}),t("charmap_append",{processor:r})})(e);const t=k(e);return((e,t)=>{e.addCommand("mceShowCharmap",()=>{q(e,t)})})(e,t),(e=>{const t=()=>e.execCommand("mceShowCharmap");e.ui.registry.addButton("charmap",{icon:"insert-character",tooltip:"Special character",onAction:t,onSetup:O(e)}),e.ui.registry.addMenuItem("charmap",{icon:"insert-character",text:"Special character...",onAction:t,onSetup:O(e)})})(e),((e,t)=>{e.ui.registry.addAutocompleter("charmap",{trigger:":",columns:"auto",minChars:2,fetch:(e,r)=>new Promise((r,a)=>{r(A(t,e))}),onAction:(t,r,a)=>{e.selection.setRng(r),e.insertContent(a),t.hide()}})})(e,t[0]),{...C(e),getMetadata:()=>({name:"Character Map",type:"opensource",slug:E})}})}(); \ No newline at end of file diff --git a/public/assets/tinymce/plugins/code/plugin.js b/public/assets/tinymce/plugins/code/plugin.js index 98e9cc192..2fb7e8fb6 100644 --- a/public/assets/tinymce/plugins/code/plugin.js +++ b/public/assets/tinymce/plugins/code/plugin.js @@ -1,5 +1,5 @@ /** - * TinyMCE version 8.1.2 (TBD) + * TinyMCE version 8.10.0 (2026-10-14) */ (function () { @@ -80,11 +80,14 @@ }); }; + const PLUGIN_CODE = 'code'; var Plugin = () => { - global.add('code', (editor) => { + global.add(PLUGIN_CODE, (editor) => { register$1(editor); register(editor); - return {}; + return { + getMetadata: () => ({ name: 'Code', type: 'opensource', slug: PLUGIN_CODE }) + }; }); }; diff --git a/public/assets/tinymce/plugins/code/plugin.min.js b/public/assets/tinymce/plugins/code/plugin.min.js index 97e346455..384630417 100644 --- a/public/assets/tinymce/plugins/code/plugin.min.js +++ b/public/assets/tinymce/plugins/code/plugin.min.js @@ -1 +1 @@ -!function(){"use strict";tinymce.util.Tools.resolve("tinymce.PluginManager").add("code",(e=>((e=>{e.addCommand("mceCodeEditor",(()=>{(e=>{const o=(e=>e.getContent({source_view:!0}))(e);e.windowManager.open({title:"Source Code",size:"large",body:{type:"panel",items:[{type:"textarea",name:"code",spellcheck:!1}]},buttons:[{type:"cancel",name:"cancel",text:"Cancel"},{type:"submit",name:"save",text:"Save",primary:!0}],initialData:{code:o},onSubmit:o=>{((e,o)=>{e.focus(),e.undoManager.transact((()=>{e.setContent(o)})),e.selection.setCursorLocation(),e.nodeChanged()})(e,o.getData().code),o.close()}})})(e)}))})(e),(e=>{const o=()=>e.execCommand("mceCodeEditor");e.ui.registry.addButton("code",{icon:"sourcecode",tooltip:"Source code",onAction:o}),e.ui.registry.addMenuItem("code",{icon:"sourcecode",text:"Source code",onAction:o})})(e),{})))}(); \ No newline at end of file +!function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager");const t="code";e.add(t,e=>((e=>{e.addCommand("mceCodeEditor",()=>{(e=>{const t=(e=>e.getContent({source_view:!0}))(e);e.windowManager.open({title:"Source Code",size:"large",body:{type:"panel",items:[{type:"textarea",name:"code",spellcheck:!1}]},buttons:[{type:"cancel",name:"cancel",text:"Cancel"},{type:"submit",name:"save",text:"Save",primary:!0}],initialData:{code:t},onSubmit:t=>{((e,t)=>{e.focus(),e.undoManager.transact(()=>{e.setContent(t)}),e.selection.setCursorLocation(),e.nodeChanged()})(e,t.getData().code),t.close()}})})(e)})})(e),(e=>{const t=()=>e.execCommand("mceCodeEditor");e.ui.registry.addButton("code",{icon:"sourcecode",tooltip:"Source code",onAction:t}),e.ui.registry.addMenuItem("code",{icon:"sourcecode",text:"Source code",onAction:t})})(e),{getMetadata:()=>({name:"Code",type:"opensource",slug:t})}))}(); \ No newline at end of file diff --git a/public/assets/tinymce/plugins/codesample/plugin.js b/public/assets/tinymce/plugins/codesample/plugin.js index 366ad5c1e..e7d138c86 100644 --- a/public/assets/tinymce/plugins/codesample/plugin.js +++ b/public/assets/tinymce/plugins/codesample/plugin.js @@ -1,5 +1,5 @@ /** - * TinyMCE version 8.1.2 (TBD) + * TinyMCE version 8.10.0 (2026-10-14) */ (function () { @@ -34,6 +34,11 @@ * strict-null-checks */ class Optional { + tag; + value; + // Sneaky optimisation: every instance of Optional.none is identical, so just + // reuse the same object + static singletonNone = new Optional(false); // The internal representation has a `tag` and a `value`, but both are // private: able to be console.logged, but not able to be accessed by code constructor(tag, value) { @@ -201,7 +206,7 @@ */ getOrDie(message) { if (!this.tag) { - throw new Error(message !== null && message !== void 0 ? message : 'Called getOrDie on None'); + throw new Error(message ?? 'Called getOrDie on None'); } else { return this.value; @@ -265,9 +270,6 @@ return this.tag ? `some(${this.value})` : 'none()'; } } - // Sneaky optimisation: every instance of Optional.none is identical, so just - // reuse the same object - Optional.singletonNone = new Optional(false); const get$1 = (xs, i) => i >= 0 && i < xs.length ? Optional.some(xs[i]) : Optional.none(); const head = (xs) => get$1(xs, 0); @@ -510,7 +512,7 @@ if (typeof document === 'undefined') { return null; } - if ('currentScript' in document && 1 < 2 /* hack to trip TS' flow analysis */) { + if (document.currentScript && document.currentScript.tagName === 'SCRIPT' && 1 < 2 /* hack to trip TS' flow analysis */) { return /** @type {any} */ (document.currentScript); } @@ -3571,11 +3573,10 @@ if (unprocessedCodeSamples.length) { editor.undoManager.transact(() => { global.each(unprocessedCodeSamples, (elm) => { - var _a; global.each(dom.select('br', elm), (elm) => { dom.replace(editor.getDoc().createTextNode('\n'), elm); }); - elm.innerHTML = dom.encode((_a = elm.textContent) !== null && _a !== void 0 ? _a : ''); + elm.innerHTML = dom.encode(elm.textContent ?? ''); get(editor).highlightElement(elm); dom.setAttrib(elm, 'data-mce-highlighted', true); elm.className = trim(elm.className); @@ -3585,10 +3586,9 @@ }); editor.on('PreInit', () => { editor.parser.addNodeFilter('pre', (nodes) => { - var _a; for (let i = 0, l = nodes.length; i < l; i++) { const node = nodes[i]; - const isCodeSample = ((_a = node.attr('class')) !== null && _a !== void 0 ? _a : '').indexOf('language-') !== -1; + const isCodeSample = (node.attr('class') ?? '').indexOf('language-') !== -1; if (isCodeSample) { node.attr('contenteditable', 'false'); node.attr('data-mce-highlighted', 'false'); @@ -3631,8 +3631,9 @@ }); }; + const PLUGIN_CODE = 'codesample'; var Plugin = () => { - global$2.add('codesample', (editor) => { + global$2.add(PLUGIN_CODE, (editor) => { register$2(editor); setup(editor); register(editor); @@ -3642,6 +3643,9 @@ open(editor); } }); + return { + getMetadata: () => ({ name: 'Code Sample', type: 'opensource', slug: PLUGIN_CODE }) + }; }); }; diff --git a/public/assets/tinymce/plugins/codesample/plugin.min.js b/public/assets/tinymce/plugins/codesample/plugin.min.js index f882087cc..ca75a0c27 100644 --- a/public/assets/tinymce/plugins/codesample/plugin.min.js +++ b/public/assets/tinymce/plugins/codesample/plugin.min.js @@ -1,4 +1,4 @@ -!function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager");const t=e=>!(e=>null==e)(e),n=()=>{};class a{constructor(e,t){this.tag=e,this.value=t}static some(e){return new a(!0,e)}static none(){return a.singletonNone}fold(e,t){return this.tag?t(this.value):e()}isSome(){return this.tag}isNone(){return!this.tag}map(e){return this.tag?a.some(e(this.value)):a.none()}bind(e){return this.tag?e(this.value):a.none()}exists(e){return this.tag&&e(this.value)}forall(e){return!this.tag||e(this.value)}filter(e){return!this.tag||e(this.value)?this:a.none()}getOr(e){return this.tag?this.value:e}or(e){return this.tag?this:e}getOrThunk(e){return this.tag?this.value:e()}orThunk(e){return this.tag?this:e()}getOrDie(e){if(this.tag)return this.value;throw new Error(null!=e?e:"Called getOrDie on None")}static from(e){return t(e)?a.some(e):a.none()}getOrNull(){return this.tag?this.value:null}getOrUndefined(){return this.value}each(e){this.tag&&e(this.value)}toArray(){return this.tag?[this.value]:[]}toString(){return this.tag?`some(${this.value})`:"none()"}}a.singletonNone=new a(!1);const s="undefined"!=typeof window?window:Function("return this;")(),r=(i=/^\s+|\s+$/g,e=>e.replace(i,""));var i,o=tinymce.util.Tools.resolve("tinymce.dom.DOMUtils");const l=function(){const e=window.Prism;window.Prism={manual:!0};var t=function(e){var t=/(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i,n=0,a={},s={manual:e.Prism&&e.Prism.manual,disableWorkerMessageHandler:e.Prism&&e.Prism.disableWorkerMessageHandler,util:{encode:function e(t){return t instanceof r?new r(t.type,e(t.content),t.alias):Array.isArray(t)?t.map(e):t.replace(/&/g,"&").replace(/=d.reach);x+=_.value.length,_=_.next){var F=_.value;if(t.length>e.length)return;if(!(F instanceof r)){var A,S=1;if(y){if(!(A=i(v,x,e,m))||A.index>=e.length)break;var $=A.index,z=A.index+A[0].length,E=x;for(E+=_.value.length;$>=E;)E+=(_=_.next).value.length;if(x=E-=_.value.length,_.value instanceof r)continue;for(var C=_;C!==t.tail&&(Ed.reach&&(d.reach=O);var P=_.prev;if(B&&(P=u(t,P,B),x+=B.length),c(t,P,S),_=u(t,P,new r(g,f?s.tokenize(j,f):j,w,j)),T&&u(t,_,T),S>1){var N={cause:g+","+b,reach:O};o(e,t,n,_.prev,x,N),d&&N.reach>d.reach&&(d.reach=N.reach)}}}}}}function l(){var e={value:null,prev:null,next:null},t={value:null,prev:e,next:null};e.next=t,this.head=e,this.tail=t,this.length=0}function u(e,t,n){var a=t.next,s={value:n,prev:t,next:a};return t.next=s,a.prev=s,e.length++,s}function c(e,t,n){for(var a=t.next,s=0;s"+r.content+""},!e.document)return e.addEventListener?(s.disableWorkerMessageHandler||e.addEventListener("message",(function(t){var n=JSON.parse(t.data),a=n.language,r=n.code,i=n.immediateClose;e.postMessage(s.highlight(r,s.languages[a],a)),i&&e.close()}),!1),s):s;var d=s.util.currentScript();function g(){s.manual||s.highlightAll()}if(d&&(s.filename=d.src,d.hasAttribute("data-manual")&&(s.manual=!0)),!s.manual){var p=document.readyState;"loading"===p||"interactive"===p&&d&&d.defer?document.addEventListener("DOMContentLoaded",g):window.requestAnimationFrame?window.requestAnimationFrame(g):window.setTimeout(g,16)}return s}("undefined"!=typeof window?window:"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?self:{}); +!function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager");const t=e=>!(e=>null==e)(e),n=()=>{};class a{tag;value;static singletonNone=new a(!1);constructor(e,t){this.tag=e,this.value=t}static some(e){return new a(!0,e)}static none(){return a.singletonNone}fold(e,t){return this.tag?t(this.value):e()}isSome(){return this.tag}isNone(){return!this.tag}map(e){return this.tag?a.some(e(this.value)):a.none()}bind(e){return this.tag?e(this.value):a.none()}exists(e){return this.tag&&e(this.value)}forall(e){return!this.tag||e(this.value)}filter(e){return!this.tag||e(this.value)?this:a.none()}getOr(e){return this.tag?this.value:e}or(e){return this.tag?this:e}getOrThunk(e){return this.tag?this.value:e()}orThunk(e){return this.tag?this:e()}getOrDie(e){if(this.tag)return this.value;throw new Error(e??"Called getOrDie on None")}static from(e){return t(e)?a.some(e):a.none()}getOrNull(){return this.tag?this.value:null}getOrUndefined(){return this.value}each(e){this.tag&&e(this.value)}toArray(){return this.tag?[this.value]:[]}toString(){return this.tag?`some(${this.value})`:"none()"}}const s="undefined"!=typeof window?window:Function("return this;")(),r=(i=/^\s+|\s+$/g,e=>e.replace(i,""));var i,o=tinymce.util.Tools.resolve("tinymce.dom.DOMUtils");const l=function(){const e=window.Prism;window.Prism={manual:!0};var t=function(e){var t=/(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i,n=0,a={},s={manual:e.Prism&&e.Prism.manual,disableWorkerMessageHandler:e.Prism&&e.Prism.disableWorkerMessageHandler,util:{encode:function e(t){return t instanceof r?new r(t.type,e(t.content),t.alias):Array.isArray(t)?t.map(e):t.replace(/&/g,"&").replace(/=d.reach);x+=_.value.length,_=_.next){var F=_.value;if(t.length>e.length)return;if(!(F instanceof r)){var A,S=1;if(y){if(!(A=i(v,x,e,f))||A.index>=e.length)break;var $=A.index,z=A.index+A[0].length,E=x;for(E+=_.value.length;$>=E;)E+=(_=_.next).value.length;if(x=E-=_.value.length,_.value instanceof r)continue;for(var C=_;C!==t.tail&&(Ed.reach&&(d.reach=P);var N=_.prev;if(B&&(N=u(t,N,B),x+=B.length),c(t,N,S),_=u(t,N,new r(g,m?s.tokenize(j,m):j,w,j)),T&&u(t,_,T),S>1){var O={cause:g+","+b,reach:P};o(e,t,n,_.prev,x,O),d&&O.reach>d.reach&&(d.reach=O.reach)}}}}}}function l(){var e={value:null,prev:null,next:null},t={value:null,prev:e,next:null};e.next=t,this.head=e,this.tail=t,this.length=0}function u(e,t,n){var a=t.next,s={value:n,prev:t,next:a};return t.next=s,a.prev=s,e.length++,s}function c(e,t,n){for(var a=t.next,s=0;s"+r.content+""},!e.document)return e.addEventListener?(s.disableWorkerMessageHandler||e.addEventListener("message",function(t){var n=JSON.parse(t.data),a=n.language,r=n.code,i=n.immediateClose;e.postMessage(s.highlight(r,s.languages[a],a)),i&&e.close()},!1),s):s;var d=s.util.currentScript();function g(){s.manual||s.highlightAll()}if(d&&(s.filename=d.src,d.hasAttribute("data-manual")&&(s.manual=!0)),!s.manual){var p=document.readyState;"loading"===p||"interactive"===p&&d&&d.defer?document.addEventListener("DOMContentLoaded",g):window.requestAnimationFrame?window.requestAnimationFrame(g):window.setTimeout(g,16)}return s}("undefined"!=typeof window?window:"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?self:{}); /** * Prism: Lightweight, robust, elegant syntax highlighting * @@ -6,4 +6,4 @@ * @author Lea Verou * @namespace * @public - */return t.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|trait)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:break|catch|continue|do|else|finally|for|function|if|in|instanceof|new|null|return|throw|try|while)\b/,boolean:/\b(?:false|true)\b/,function:/\b\w+(?=\()/,number:/\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/},function(e){function t(e,t){return"___"+e.toUpperCase()+t+"___"}Object.defineProperties(e.languages["markup-templating"]={},{buildPlaceholders:{value:function(n,a,s,r){if(n.language===a){var i=n.tokenStack=[];n.code=n.code.replace(s,(function(e){if("function"==typeof r&&!r(e))return e;for(var s,o=i.length;-1!==n.code.indexOf(s=t(a,o));)++o;return i[o]=e,s})),n.grammar=e.languages.markup}}},tokenizePlaceholders:{value:function(n,a){if(n.language===a&&n.tokenStack){n.grammar=e.languages[a];var s=0,r=Object.keys(n.tokenStack);!function i(o){for(var l=0;l=r.length);l++){var u=o[l];if("string"==typeof u||u.content&&"string"==typeof u.content){var c=r[s],d=n.tokenStack[c],g="string"==typeof u?u:u.content,p=t(a,c),b=g.indexOf(p);if(b>-1){++s;var h=g.substring(0,b),f=new e.Token(a,e.tokenize(d,n.grammar),"language-"+a,d),m=g.substring(b+p.length),y=[];h&&y.push.apply(y,i([h])),y.push(f),m&&y.push.apply(y,i([m])),"string"==typeof u?o.splice.apply(o,[l,1].concat(y)):u.content=y}}else u.content&&i(u.content)}return o}(n.tokens)}}}})}(t),t.languages.c=t.languages.extend("clike",{comment:{pattern:/\/\/(?:[^\r\n\\]|\\(?:\r\n?|\n|(?![\r\n])))*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0},"class-name":{pattern:/(\b(?:enum|struct)\s+(?:__attribute__\s*\(\([\s\S]*?\)\)\s*)?)\w+|\b[a-z]\w*_t\b/,lookbehind:!0},keyword:/\b(?:_Alignas|_Alignof|_Atomic|_Bool|_Complex|_Generic|_Imaginary|_Noreturn|_Static_assert|_Thread_local|__attribute__|asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|inline|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|typeof|union|unsigned|void|volatile|while)\b/,function:/\b[a-z_]\w*(?=\s*\()/i,number:/(?:\b0x(?:[\da-f]+(?:\.[\da-f]*)?|\.[\da-f]+)(?:p[+-]?\d+)?|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)[ful]{0,4}/i,operator:/>>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*/%&|^!=<>]=?/}),t.languages.insertBefore("c","string",{char:{pattern:/'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n]){0,32}'/,greedy:!0}}),t.languages.insertBefore("c","string",{macro:{pattern:/(^[\t ]*)#\s*[a-z](?:[^\r\n\\/]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|\\(?:\r\n|[\s\S]))*/im,lookbehind:!0,greedy:!0,alias:"property",inside:{string:[{pattern:/^(#\s*include\s*)<[^>]+>/,lookbehind:!0},t.languages.c.string],char:t.languages.c.char,comment:t.languages.c.comment,"macro-name":[{pattern:/(^#\s*define\s+)\w+\b(?!\()/i,lookbehind:!0},{pattern:/(^#\s*define\s+)\w+\b(?=\()/i,lookbehind:!0,alias:"function"}],directive:{pattern:/^(#\s*)[a-z]+/,lookbehind:!0,alias:"keyword"},"directive-hash":/^#/,punctuation:/##|\\(?=[\r\n])/,expression:{pattern:/\S[\s\S]*/,inside:t.languages.c}}}}),t.languages.insertBefore("c","function",{constant:/\b(?:EOF|NULL|SEEK_CUR|SEEK_END|SEEK_SET|__DATE__|__FILE__|__LINE__|__TIMESTAMP__|__TIME__|__func__|stderr|stdin|stdout)\b/}),delete t.languages.c.boolean,function(e){var t=/\b(?:alignas|alignof|asm|auto|bool|break|case|catch|char|char16_t|char32_t|char8_t|class|co_await|co_return|co_yield|compl|concept|const|const_cast|consteval|constexpr|constinit|continue|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|final|float|for|friend|goto|if|import|inline|int|int16_t|int32_t|int64_t|int8_t|long|module|mutable|namespace|new|noexcept|nullptr|operator|override|private|protected|public|register|reinterpret_cast|requires|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|uint16_t|uint32_t|uint64_t|uint8_t|union|unsigned|using|virtual|void|volatile|wchar_t|while)\b/,n=/\b(?!)\w+(?:\s*\.\s*\w+)*\b/.source.replace(//g,(function(){return t.source}));e.languages.cpp=e.languages.extend("c",{"class-name":[{pattern:RegExp(/(\b(?:class|concept|enum|struct|typename)\s+)(?!)\w+/.source.replace(//g,(function(){return t.source}))),lookbehind:!0},/\b[A-Z]\w*(?=\s*::\s*\w+\s*\()/,/\b[A-Z_]\w*(?=\s*::\s*~\w+\s*\()/i,/\b\w+(?=\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>\s*::\s*\w+\s*\()/],keyword:t,number:{pattern:/(?:\b0b[01']+|\b0x(?:[\da-f']+(?:\.[\da-f']*)?|\.[\da-f']+)(?:p[+-]?[\d']+)?|(?:\b[\d']+(?:\.[\d']*)?|\B\.[\d']+)(?:e[+-]?[\d']+)?)[ful]{0,4}/i,greedy:!0},operator:/>>=?|<<=?|->|--|\+\+|&&|\|\||[?:~]|<=>|[-+*/%&|^!=<>]=?|\b(?:and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\b/,boolean:/\b(?:false|true)\b/}),e.languages.insertBefore("cpp","string",{module:{pattern:RegExp(/(\b(?:import|module)\s+)/.source+"(?:"+/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|<[^<>\r\n]*>/.source+"|"+/(?:\s*:\s*)?|:\s*/.source.replace(//g,(function(){return n}))+")"),lookbehind:!0,greedy:!0,inside:{string:/^[<"][\s\S]+/,operator:/:/,punctuation:/\./}},"raw-string":{pattern:/R"([^()\\ ]{0,16})\([\s\S]*?\)\1"/,alias:"string",greedy:!0}}),e.languages.insertBefore("cpp","keyword",{"generic-function":{pattern:/\b(?!operator\b)[a-z_]\w*\s*<(?:[^<>]|<[^<>]*>)*>(?=\s*\()/i,inside:{function:/^\w+/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:e.languages.cpp}}}}),e.languages.insertBefore("cpp","operator",{"double-colon":{pattern:/::/,alias:"punctuation"}}),e.languages.insertBefore("cpp","class-name",{"base-clause":{pattern:/(\b(?:class|struct)\s+\w+\s*:\s*)[^;{}"'\s]+(?:\s+[^;{}"'\s]+)*(?=\s*[;{])/,lookbehind:!0,greedy:!0,inside:e.languages.extend("cpp",{})}}),e.languages.insertBefore("inside","double-colon",{"class-name":/\b[a-z_]\w*\b(?!\s*::)/i},e.languages.cpp["base-clause"])}(t),function(e){function t(e,t){return e.replace(/<<(\d+)>>/g,(function(e,n){return"(?:"+t[+n]+")"}))}function n(e,n,a){return RegExp(t(e,n),a||"")}function a(e,t){for(var n=0;n>/g,(function(){return"(?:"+e+")"}));return e.replace(/<>/g,"[^\\s\\S]")}var s="bool byte char decimal double dynamic float int long object sbyte short string uint ulong ushort var void",r="class enum interface record struct",i="add alias and ascending async await by descending from(?=\\s*(?:\\w|$)) get global group into init(?=\\s*;) join let nameof not notnull on or orderby partial remove select set unmanaged value when where with(?=\\s*{)",o="abstract as base break case catch checked const continue default delegate do else event explicit extern finally fixed for foreach goto if implicit in internal is lock namespace new null operator out override params private protected public readonly ref return sealed sizeof stackalloc static switch this throw try typeof unchecked unsafe using virtual volatile while yield";function l(e){return"\\b(?:"+e.trim().replace(/ /g,"|")+")\\b"}var u=l(r),c=RegExp(l(s+" "+r+" "+i+" "+o)),d=l(r+" "+i+" "+o),g=l(s+" "+r+" "+o),p=a(/<(?:[^<>;=+\-*/%&|^]|<>)*>/.source,2),b=a(/\((?:[^()]|<>)*\)/.source,2),h=/@?\b[A-Za-z_]\w*\b/.source,f=t(/<<0>>(?:\s*<<1>>)?/.source,[h,p]),m=t(/(?!<<0>>)<<1>>(?:\s*\.\s*<<1>>)*/.source,[d,f]),y=/\[\s*(?:,\s*)*\]/.source,w=t(/<<0>>(?:\s*(?:\?\s*)?<<1>>)*(?:\s*\?)?/.source,[m,y]),k=t(/[^,()<>[\];=+\-*/%&|^]|<<0>>|<<1>>|<<2>>/.source,[p,b,y]),v=t(/\(<<0>>+(?:,<<0>>+)+\)/.source,[k]),_=t(/(?:<<0>>|<<1>>)(?:\s*(?:\?\s*)?<<2>>)*(?:\s*\?)?/.source,[v,m,y]),x={keyword:c,punctuation:/[<>()?,.:[\]]/},F=/'(?:[^\r\n'\\]|\\.|\\[Uux][\da-fA-F]{1,8})'/.source,A=/"(?:\\.|[^\\"\r\n])*"/.source,S=/@"(?:""|\\[\s\S]|[^\\"])*"(?!")/.source;e.languages.csharp=e.languages.extend("clike",{string:[{pattern:n(/(^|[^$\\])<<0>>/.source,[S]),lookbehind:!0,greedy:!0},{pattern:n(/(^|[^@$\\])<<0>>/.source,[A]),lookbehind:!0,greedy:!0}],"class-name":[{pattern:n(/(\busing\s+static\s+)<<0>>(?=\s*;)/.source,[m]),lookbehind:!0,inside:x},{pattern:n(/(\busing\s+<<0>>\s*=\s*)<<1>>(?=\s*;)/.source,[h,_]),lookbehind:!0,inside:x},{pattern:n(/(\busing\s+)<<0>>(?=\s*=)/.source,[h]),lookbehind:!0},{pattern:n(/(\b<<0>>\s+)<<1>>/.source,[u,f]),lookbehind:!0,inside:x},{pattern:n(/(\bcatch\s*\(\s*)<<0>>/.source,[m]),lookbehind:!0,inside:x},{pattern:n(/(\bwhere\s+)<<0>>/.source,[h]),lookbehind:!0},{pattern:n(/(\b(?:is(?:\s+not)?|as)\s+)<<0>>/.source,[w]),lookbehind:!0,inside:x},{pattern:n(/\b<<0>>(?=\s+(?!<<1>>|with\s*\{)<<2>>(?:\s*[=,;:{)\]]|\s+(?:in|when)\b))/.source,[_,g,h]),inside:x}],keyword:c,number:/(?:\b0(?:x[\da-f_]*[\da-f]|b[01_]*[01])|(?:\B\.\d+(?:_+\d+)*|\b\d+(?:_+\d+)*(?:\.\d+(?:_+\d+)*)?)(?:e[-+]?\d+(?:_+\d+)*)?)(?:[dflmu]|lu|ul)?\b/i,operator:/>>=?|<<=?|[-=]>|([-+&|])\1|~|\?\?=?|[-+*/%&|^!=<>]=?/,punctuation:/\?\.?|::|[{}[\];(),.:]/}),e.languages.insertBefore("csharp","number",{range:{pattern:/\.\./,alias:"operator"}}),e.languages.insertBefore("csharp","punctuation",{"named-parameter":{pattern:n(/([(,]\s*)<<0>>(?=\s*:)/.source,[h]),lookbehind:!0,alias:"punctuation"}}),e.languages.insertBefore("csharp","class-name",{namespace:{pattern:n(/(\b(?:namespace|using)\s+)<<0>>(?:\s*\.\s*<<0>>)*(?=\s*[;{])/.source,[h]),lookbehind:!0,inside:{punctuation:/\./}},"type-expression":{pattern:n(/(\b(?:default|sizeof|typeof)\s*\(\s*(?!\s))(?:[^()\s]|\s(?!\s)|<<0>>)*(?=\s*\))/.source,[b]),lookbehind:!0,alias:"class-name",inside:x},"return-type":{pattern:n(/<<0>>(?=\s+(?:<<1>>\s*(?:=>|[({]|\.\s*this\s*\[)|this\s*\[))/.source,[_,m]),inside:x,alias:"class-name"},"constructor-invocation":{pattern:n(/(\bnew\s+)<<0>>(?=\s*[[({])/.source,[_]),lookbehind:!0,inside:x,alias:"class-name"},"generic-method":{pattern:n(/<<0>>\s*<<1>>(?=\s*\()/.source,[h,p]),inside:{function:n(/^<<0>>/.source,[h]),generic:{pattern:RegExp(p),alias:"class-name",inside:x}}},"type-list":{pattern:n(/\b((?:<<0>>\s+<<1>>|record\s+<<1>>\s*<<5>>|where\s+<<2>>)\s*:\s*)(?:<<3>>|<<4>>|<<1>>\s*<<5>>|<<6>>)(?:\s*,\s*(?:<<3>>|<<4>>|<<6>>))*(?=\s*(?:where|[{;]|=>|$))/.source,[u,f,h,_,c.source,b,/\bnew\s*\(\s*\)/.source]),lookbehind:!0,inside:{"record-arguments":{pattern:n(/(^(?!new\s*\()<<0>>\s*)<<1>>/.source,[f,b]),lookbehind:!0,greedy:!0,inside:e.languages.csharp},keyword:c,"class-name":{pattern:RegExp(_),greedy:!0,inside:x},punctuation:/[,()]/}},preprocessor:{pattern:/(^[\t ]*)#.*/m,lookbehind:!0,alias:"property",inside:{directive:{pattern:/(#)\b(?:define|elif|else|endif|endregion|error|if|line|nullable|pragma|region|undef|warning)\b/,lookbehind:!0,alias:"keyword"}}}});var $=A+"|"+F,z=t(/\/(?![*/])|\/\/[^\r\n]*[\r\n]|\/\*(?:[^*]|\*(?!\/))*\*\/|<<0>>/.source,[$]),E=a(t(/[^"'/()]|<<0>>|\(<>*\)/.source,[z]),2),C=/\b(?:assembly|event|field|method|module|param|property|return|type)\b/.source,j=t(/<<0>>(?:\s*\(<<1>>*\))?/.source,[m,E]);e.languages.insertBefore("csharp","class-name",{attribute:{pattern:n(/((?:^|[^\s\w>)?])\s*\[\s*)(?:<<0>>\s*:\s*)?<<1>>(?:\s*,\s*<<1>>)*(?=\s*\])/.source,[C,j]),lookbehind:!0,greedy:!0,inside:{target:{pattern:n(/^<<0>>(?=\s*:)/.source,[C]),alias:"keyword"},"attribute-arguments":{pattern:n(/\(<<0>>*\)/.source,[E]),inside:e.languages.csharp},"class-name":{pattern:RegExp(m),inside:{punctuation:/\./}},punctuation:/[:,]/}}});var B=/:[^}\r\n]+/.source,T=a(t(/[^"'/()]|<<0>>|\(<>*\)/.source,[z]),2),O=t(/\{(?!\{)(?:(?![}:])<<0>>)*<<1>>?\}/.source,[T,B]),P=a(t(/[^"'/()]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|<<0>>|\(<>*\)/.source,[$]),2),N=t(/\{(?!\{)(?:(?![}:])<<0>>)*<<1>>?\}/.source,[P,B]);function R(t,a){return{interpolation:{pattern:n(/((?:^|[^{])(?:\{\{)*)<<0>>/.source,[t]),lookbehind:!0,inside:{"format-string":{pattern:n(/(^\{(?:(?![}:])<<0>>)*)<<1>>(?=\}$)/.source,[a,B]),lookbehind:!0,inside:{punctuation:/^:/}},punctuation:/^\{|\}$/,expression:{pattern:/[\s\S]+/,alias:"language-csharp",inside:e.languages.csharp}}},string:/[\s\S]+/}}e.languages.insertBefore("csharp","string",{"interpolation-string":[{pattern:n(/(^|[^\\])(?:\$@|@\$)"(?:""|\\[\s\S]|\{\{|<<0>>|[^\\{"])*"/.source,[O]),lookbehind:!0,greedy:!0,inside:R(O,T)},{pattern:n(/(^|[^@\\])\$"(?:\\.|\{\{|<<0>>|[^\\"{])*"/.source,[N]),lookbehind:!0,greedy:!0,inside:R(N,P)}],char:{pattern:RegExp(F),greedy:!0}}),e.languages.dotnet=e.languages.cs=e.languages.csharp}(t),function(e){var t=/(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/;e.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:RegExp("@[\\w-](?:"+/[^;{\s"']|\s+(?!\s)/.source+"|"+t.source+")*?"+/(?:;|(?=\s*\{))/.source),inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+t.source+"|"+/(?:[^\\\r\n()"']|\\[\s\S])*/.source+")\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+t.source+"$"),alias:"url"}}},selector:{pattern:RegExp("(^|[{}\\s])[^{}\\s](?:[^{};\"'\\s]|\\s+(?![\\s{])|"+t.source+")*(?=\\s*\\{)"),lookbehind:!0},string:{pattern:t,greedy:!0},property:{pattern:/(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,lookbehind:!0},important:/!important\b/i,function:{pattern:/(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,lookbehind:!0},punctuation:/[(){};:,]/},e.languages.css.atrule.inside.rest=e.languages.css;var n=e.languages.markup;n&&(n.tag.addInlined("style","css"),n.tag.addAttribute("style","css"))}(t),function(e){var t=/\b(?:abstract|assert|boolean|break|byte|case|catch|char|class|const|continue|default|do|double|else|enum|exports|extends|final|finally|float|for|goto|if|implements|import|instanceof|int|interface|long|module|native|new|non-sealed|null|open|opens|package|permits|private|protected|provides|public|record(?!\s*[(){}[\]<>=%~.:,;?+\-*/&|^])|requires|return|sealed|short|static|strictfp|super|switch|synchronized|this|throw|throws|to|transient|transitive|try|uses|var|void|volatile|while|with|yield)\b/,n=/(?:[a-z]\w*\s*\.\s*)*(?:[A-Z]\w*\s*\.\s*)*/.source,a={pattern:RegExp(/(^|[^\w.])/.source+n+/[A-Z](?:[\d_A-Z]*[a-z]\w*)?\b/.source),lookbehind:!0,inside:{namespace:{pattern:/^[a-z]\w*(?:\s*\.\s*[a-z]\w*)*(?:\s*\.)?/,inside:{punctuation:/\./}},punctuation:/\./}};e.languages.java=e.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\.|[^"\\\r\n])*"/,lookbehind:!0,greedy:!0},"class-name":[a,{pattern:RegExp(/(^|[^\w.])/.source+n+/[A-Z]\w*(?=\s+\w+\s*[;,=()]|\s*(?:\[[\s,]*\]\s*)?::\s*new\b)/.source),lookbehind:!0,inside:a.inside},{pattern:RegExp(/(\b(?:class|enum|extends|implements|instanceof|interface|new|record|throws)\s+)/.source+n+/[A-Z]\w*\b/.source),lookbehind:!0,inside:a.inside}],keyword:t,function:[e.languages.clike.function,{pattern:/(::\s*)[a-z_]\w*/,lookbehind:!0}],number:/\b0b[01][01_]*L?\b|\b0x(?:\.[\da-f_p+-]+|[\da-f_]+(?:\.[\da-f_p+-]+)?)\b|(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?\d[\d_]*)?[dfl]?/i,operator:{pattern:/(^|[^.])(?:<<=?|>>>?=?|->|--|\+\+|&&|\|\||::|[?:~]|[-+*/%&|^!=<>]=?)/m,lookbehind:!0},constant:/\b[A-Z][A-Z_\d]+\b/}),e.languages.insertBefore("java","string",{"triple-quoted-string":{pattern:/"""[ \t]*[\r\n](?:(?:"|"")?(?:\\.|[^"\\]))*"""/,greedy:!0,alias:"string"},char:{pattern:/'(?:\\.|[^'\\\r\n]){1,6}'/,greedy:!0}}),e.languages.insertBefore("java","class-name",{annotation:{pattern:/(^|[^.])@\w+(?:\s*\.\s*\w+)*/,lookbehind:!0,alias:"punctuation"},generics:{pattern:/<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&))*>)*>)*>)*>/,inside:{"class-name":a,keyword:t,punctuation:/[<>(),.:]/,operator:/[?&|]/}},import:[{pattern:RegExp(/(\bimport\s+)/.source+n+/(?:[A-Z]\w*|\*)(?=\s*;)/.source),lookbehind:!0,inside:{namespace:a.inside.namespace,punctuation:/\./,operator:/\*/,"class-name":/\w+/}},{pattern:RegExp(/(\bimport\s+static\s+)/.source+n+/(?:\w+|\*)(?=\s*;)/.source),lookbehind:!0,alias:"static",inside:{namespace:a.inside.namespace,static:/\b\w+$/,punctuation:/\./,operator:/\*/,"class-name":/\w+/}}],namespace:{pattern:RegExp(/(\b(?:exports|import(?:\s+static)?|module|open|opens|package|provides|requires|to|transitive|uses|with)\s+)(?!)[a-z]\w*(?:\.[a-z]\w*)*\.?/.source.replace(//g,(function(){return t.source}))),lookbehind:!0,inside:{punctuation:/\./}}})}(t),t.languages.javascript=t.languages.extend("clike",{"class-name":[t.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:{pattern:RegExp(/(^|[^\w$])/.source+"(?:"+/NaN|Infinity/.source+"|"+/0[bB][01]+(?:_[01]+)*n?/.source+"|"+/0[oO][0-7]+(?:_[0-7]+)*n?/.source+"|"+/0[xX][\dA-Fa-f]+(?:_[\dA-Fa-f]+)*n?/.source+"|"+/\d+(?:_\d+)*n/.source+"|"+/(?:\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\.\d+(?:_\d+)*)(?:[Ee][+-]?\d+(?:_\d+)*)?/.source+")"+/(?![\w$])/.source),lookbehind:!0},operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),t.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/,t.languages.insertBefore("javascript","keyword",{regex:{pattern:RegExp(/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)/.source+/\//.source+"(?:"+/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}/.source+"|"+/(?:\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.)*\])*\])*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}v[dgimyus]{0,7}/.source+")"+/(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/.source),lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:t.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:t.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:t.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:t.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:t.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),t.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:t.languages.javascript}},string:/[\s\S]+/}},"string-property":{pattern:/((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,lookbehind:!0,greedy:!0,alias:"property"}}),t.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}}),t.languages.markup&&(t.languages.markup.tag.addInlined("script","javascript"),t.languages.markup.tag.addAttribute(/on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)/.source,"javascript")),t.languages.js=t.languages.javascript,t.languages.markup={comment:{pattern://,greedy:!0},prolog:{pattern:/<\?[\s\S]+?\?>/,greedy:!0},doctype:{pattern:/"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^$|[[\]]/,"doctype-tag":/^DOCTYPE/i,name:/[^\s<>'"]+/}},cdata:{pattern://i,greedy:!0},tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},{pattern:/^(\s*)["']|["']$/,lookbehind:!0}]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]},t.languages.markup.tag.inside["attr-value"].inside.entity=t.languages.markup.entity,t.languages.markup.doctype.inside["internal-subset"].inside=t.languages.markup,t.hooks.add("wrap",(function(e){"entity"===e.type&&(e.attributes.title=e.content.replace(/&/,"&"))})),Object.defineProperty(t.languages.markup.tag,"addInlined",{value:function(e,n){var a={};a["language-"+n]={pattern:/(^$)/i,lookbehind:!0,inside:t.languages[n]},a.cdata=/^$/i;var s={"included-cdata":{pattern://i,inside:a}};s["language-"+n]={pattern:/[\s\S]+/,inside:t.languages[n]};var r={};r[e]={pattern:RegExp(/(<__[^>]*>)(?:))*\]\]>|(?!)/.source.replace(/__/g,(function(){return e})),"i"),lookbehind:!0,greedy:!0,inside:s},t.languages.insertBefore("markup","cdata",r)}}),Object.defineProperty(t.languages.markup.tag,"addAttribute",{value:function(e,n){t.languages.markup.tag.inside["special-attr"].push({pattern:RegExp(/(^|["'\s])/.source+"(?:"+e+")"+/\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))/.source,"i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[n,"language-"+n],inside:t.languages[n]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}}),t.languages.html=t.languages.markup,t.languages.mathml=t.languages.markup,t.languages.svg=t.languages.markup,t.languages.xml=t.languages.extend("markup",{}),t.languages.ssml=t.languages.xml,t.languages.atom=t.languages.xml,t.languages.rss=t.languages.xml,function(e){var t=/\/\*[\s\S]*?\*\/|\/\/.*|#(?!\[).*/,n=[{pattern:/\b(?:false|true)\b/i,alias:"boolean"},{pattern:/(::\s*)\b[a-z_]\w*\b(?!\s*\()/i,greedy:!0,lookbehind:!0},{pattern:/(\b(?:case|const)\s+)\b[a-z_]\w*(?=\s*[;=])/i,greedy:!0,lookbehind:!0},/\b(?:null)\b/i,/\b[A-Z_][A-Z0-9_]*\b(?!\s*\()/],a=/\b0b[01]+(?:_[01]+)*\b|\b0o[0-7]+(?:_[0-7]+)*\b|\b0x[\da-f]+(?:_[\da-f]+)*\b|(?:\b\d+(?:_\d+)*\.?(?:\d+(?:_\d+)*)?|\B\.\d+)(?:e[+-]?\d+)?/i,s=/|\?\?=?|\.{3}|\??->|[!=]=?=?|::|\*\*=?|--|\+\+|&&|\|\||<<|>>|[?~]|[/^|%*&<>.+-]=?/,r=/[{}\[\](),:;]/;e.languages.php={delimiter:{pattern:/\?>$|^<\?(?:php(?=\s)|=)?/i,alias:"important"},comment:t,variable:/\$+(?:\w+\b|(?=\{))/,package:{pattern:/(namespace\s+|use\s+(?:function\s+)?)(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,lookbehind:!0,inside:{punctuation:/\\/}},"class-name-definition":{pattern:/(\b(?:class|enum|interface|trait)\s+)\b[a-z_]\w*(?!\\)\b/i,lookbehind:!0,alias:"class-name"},"function-definition":{pattern:/(\bfunction\s+)[a-z_]\w*(?=\s*\()/i,lookbehind:!0,alias:"function"},keyword:[{pattern:/(\(\s*)\b(?:array|bool|boolean|float|int|integer|object|string)\b(?=\s*\))/i,alias:"type-casting",greedy:!0,lookbehind:!0},{pattern:/([(,?]\s*)\b(?:array(?!\s*\()|bool|callable|(?:false|null)(?=\s*\|)|float|int|iterable|mixed|object|self|static|string)\b(?=\s*\$)/i,alias:"type-hint",greedy:!0,lookbehind:!0},{pattern:/(\)\s*:\s*(?:\?\s*)?)\b(?:array(?!\s*\()|bool|callable|(?:false|null)(?=\s*\|)|float|int|iterable|mixed|never|object|self|static|string|void)\b/i,alias:"return-type",greedy:!0,lookbehind:!0},{pattern:/\b(?:array(?!\s*\()|bool|float|int|iterable|mixed|object|string|void)\b/i,alias:"type-declaration",greedy:!0},{pattern:/(\|\s*)(?:false|null)\b|\b(?:false|null)(?=\s*\|)/i,alias:"type-declaration",greedy:!0,lookbehind:!0},{pattern:/\b(?:parent|self|static)(?=\s*::)/i,alias:"static-context",greedy:!0},{pattern:/(\byield\s+)from\b/i,lookbehind:!0},/\bclass\b/i,{pattern:/((?:^|[^\s>:]|(?:^|[^-])>|(?:^|[^:]):)\s*)\b(?:abstract|and|array|as|break|callable|case|catch|clone|const|continue|declare|default|die|do|echo|else|elseif|empty|enddeclare|endfor|endforeach|endif|endswitch|endwhile|enum|eval|exit|extends|final|finally|fn|for|foreach|function|global|goto|if|implements|include|include_once|instanceof|insteadof|interface|isset|list|match|namespace|never|new|or|parent|print|private|protected|public|readonly|require|require_once|return|self|static|switch|throw|trait|try|unset|use|var|while|xor|yield|__halt_compiler)\b/i,lookbehind:!0}],"argument-name":{pattern:/([(,]\s*)\b[a-z_]\w*(?=\s*:(?!:))/i,lookbehind:!0},"class-name":[{pattern:/(\b(?:extends|implements|instanceof|new(?!\s+self|\s+static))\s+|\bcatch\s*\()\b[a-z_]\w*(?!\\)\b/i,greedy:!0,lookbehind:!0},{pattern:/(\|\s*)\b[a-z_]\w*(?!\\)\b/i,greedy:!0,lookbehind:!0},{pattern:/\b[a-z_]\w*(?!\\)\b(?=\s*\|)/i,greedy:!0},{pattern:/(\|\s*)(?:\\?\b[a-z_]\w*)+\b/i,alias:"class-name-fully-qualified",greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/(?:\\?\b[a-z_]\w*)+\b(?=\s*\|)/i,alias:"class-name-fully-qualified",greedy:!0,inside:{punctuation:/\\/}},{pattern:/(\b(?:extends|implements|instanceof|new(?!\s+self\b|\s+static\b))\s+|\bcatch\s*\()(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,alias:"class-name-fully-qualified",greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/\b[a-z_]\w*(?=\s*\$)/i,alias:"type-declaration",greedy:!0},{pattern:/(?:\\?\b[a-z_]\w*)+(?=\s*\$)/i,alias:["class-name-fully-qualified","type-declaration"],greedy:!0,inside:{punctuation:/\\/}},{pattern:/\b[a-z_]\w*(?=\s*::)/i,alias:"static-context",greedy:!0},{pattern:/(?:\\?\b[a-z_]\w*)+(?=\s*::)/i,alias:["class-name-fully-qualified","static-context"],greedy:!0,inside:{punctuation:/\\/}},{pattern:/([(,?]\s*)[a-z_]\w*(?=\s*\$)/i,alias:"type-hint",greedy:!0,lookbehind:!0},{pattern:/([(,?]\s*)(?:\\?\b[a-z_]\w*)+(?=\s*\$)/i,alias:["class-name-fully-qualified","type-hint"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/(\)\s*:\s*(?:\?\s*)?)\b[a-z_]\w*(?!\\)\b/i,alias:"return-type",greedy:!0,lookbehind:!0},{pattern:/(\)\s*:\s*(?:\?\s*)?)(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,alias:["class-name-fully-qualified","return-type"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}}],constant:n,function:{pattern:/(^|[^\\\w])\\?[a-z_](?:[\w\\]*\w)?(?=\s*\()/i,lookbehind:!0,inside:{punctuation:/\\/}},property:{pattern:/(->\s*)\w+/,lookbehind:!0},number:a,operator:s,punctuation:r};var i={pattern:/\{\$(?:\{(?:\{[^{}]+\}|[^{}]+)\}|[^{}])+\}|(^|[^\\{])\$+(?:\w+(?:\[[^\r\n\[\]]+\]|->\w+)?)/,lookbehind:!0,inside:e.languages.php},o=[{pattern:/<<<'([^']+)'[\r\n](?:.*[\r\n])*?\1;/,alias:"nowdoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<<'[^']+'|[a-z_]\w*;$/i,alias:"symbol",inside:{punctuation:/^<<<'?|[';]$/}}}},{pattern:/<<<(?:"([^"]+)"[\r\n](?:.*[\r\n])*?\1;|([a-z_]\w*)[\r\n](?:.*[\r\n])*?\2;)/i,alias:"heredoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<<(?:"[^"]+"|[a-z_]\w*)|[a-z_]\w*;$/i,alias:"symbol",inside:{punctuation:/^<<<"?|[";]$/}},interpolation:i}},{pattern:/`(?:\\[\s\S]|[^\\`])*`/,alias:"backtick-quoted-string",greedy:!0},{pattern:/'(?:\\[\s\S]|[^\\'])*'/,alias:"single-quoted-string",greedy:!0},{pattern:/"(?:\\[\s\S]|[^\\"])*"/,alias:"double-quoted-string",greedy:!0,inside:{interpolation:i}}];e.languages.insertBefore("php","variable",{string:o,attribute:{pattern:/#\[(?:[^"'\/#]|\/(?![*/])|\/\/.*$|#(?!\[).*$|\/\*(?:[^*]|\*(?!\/))*\*\/|"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*')+\](?=\s*[a-z$#])/im,greedy:!0,inside:{"attribute-content":{pattern:/^(#\[)[\s\S]+(?=\]$)/,lookbehind:!0,inside:{comment:t,string:o,"attribute-class-name":[{pattern:/([^:]|^)\b[a-z_]\w*(?!\\)\b/i,alias:"class-name",greedy:!0,lookbehind:!0},{pattern:/([^:]|^)(?:\\?\b[a-z_]\w*)+/i,alias:["class-name","class-name-fully-qualified"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}}],constant:n,number:a,operator:s,punctuation:r}},delimiter:{pattern:/^#\[|\]$/,alias:"punctuation"}}}}),e.hooks.add("before-tokenize",(function(t){/<\?/.test(t.code)&&e.languages["markup-templating"].buildPlaceholders(t,"php",/<\?(?:[^"'/#]|\/(?![*/])|("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|(?:\/\/|#(?!\[))(?:[^?\n\r]|\?(?!>))*(?=$|\?>|[\r\n])|#\[|\/\*(?:[^*]|\*(?!\/))*(?:\*\/|$))*?(?:\?>|$)/g)})),e.hooks.add("after-tokenize",(function(t){e.languages["markup-templating"].tokenizePlaceholders(t,"php")}))}(t),t.languages.python={comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0,greedy:!0},"string-interpolation":{pattern:/(?:f|fr|rf)(?:("""|''')[\s\S]*?\1|("|')(?:\\.|(?!\2)[^\\\r\n])*\2)/i,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^{])(?:\{\{)*)\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}])+\})+\})+\}/,lookbehind:!0,inside:{"format-spec":{pattern:/(:)[^:(){}]+(?=\}$)/,lookbehind:!0},"conversion-option":{pattern:/![sra](?=[:}]$)/,alias:"punctuation"},rest:null}},string:/[\s\S]+/}},"triple-quoted-string":{pattern:/(?:[rub]|br|rb)?("""|''')[\s\S]*?\1/i,greedy:!0,alias:"string"},string:{pattern:/(?:[rub]|br|rb)?("|')(?:\\.|(?!\1)[^\\\r\n])*\1/i,greedy:!0},function:{pattern:/((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/g,lookbehind:!0},"class-name":{pattern:/(\bclass\s+)\w+/i,lookbehind:!0},decorator:{pattern:/(^[\t ]*)@\w+(?:\.\w+)*/m,lookbehind:!0,alias:["annotation","punctuation"],inside:{punctuation:/\./}},keyword:/\b(?:_(?=\s*:)|and|as|assert|async|await|break|case|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|match|nonlocal|not|or|pass|print|raise|return|try|while|with|yield)\b/,builtin:/\b(?:__import__|abs|all|any|apply|ascii|basestring|bin|bool|buffer|bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|memoryview|min|next|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|unichr|unicode|vars|xrange|zip)\b/,boolean:/\b(?:False|None|True)\b/,number:/\b0(?:b(?:_?[01])+|o(?:_?[0-7])+|x(?:_?[a-f0-9])+)\b|(?:\b\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\B\.\d+(?:_\d+)*)(?:e[+-]?\d+(?:_\d+)*)?j?(?!\w)/i,operator:/[-+%=]=?|!=|:=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,punctuation:/[{}[\];(),.:]/},t.languages.python["string-interpolation"].inside.interpolation.inside.rest=t.languages.python,t.languages.py=t.languages.python,function(e){e.languages.ruby=e.languages.extend("clike",{comment:{pattern:/#.*|^=begin\s[\s\S]*?^=end/m,greedy:!0},"class-name":{pattern:/(\b(?:class|module)\s+|\bcatch\s+\()[\w.\\]+|\b[A-Z_]\w*(?=\s*\.\s*new\b)/,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:BEGIN|END|alias|and|begin|break|case|class|def|define_method|defined|do|each|else|elsif|end|ensure|extend|for|if|in|include|module|new|next|nil|not|or|prepend|private|protected|public|raise|redo|require|rescue|retry|return|self|super|then|throw|undef|unless|until|when|while|yield)\b/,operator:/\.{2,3}|&\.|===||[!=]?~|(?:&&|\|\||<<|>>|\*\*|[+\-*/%<>!^&|=])=?|[?:]/,punctuation:/[(){}[\].,;]/}),e.languages.insertBefore("ruby","operator",{"double-colon":{pattern:/::/,alias:"punctuation"}});var t={pattern:/((?:^|[^\\])(?:\\{2})*)#\{(?:[^{}]|\{[^{}]*\})*\}/,lookbehind:!0,inside:{content:{pattern:/^(#\{)[\s\S]+(?=\}$)/,lookbehind:!0,inside:e.languages.ruby},delimiter:{pattern:/^#\{|\}$/,alias:"punctuation"}}};delete e.languages.ruby.function;var n="(?:"+[/([^a-zA-Z0-9\s{(\[<=])(?:(?!\1)[^\\]|\\[\s\S])*\1/.source,/\((?:[^()\\]|\\[\s\S]|\((?:[^()\\]|\\[\s\S])*\))*\)/.source,/\{(?:[^{}\\]|\\[\s\S]|\{(?:[^{}\\]|\\[\s\S])*\})*\}/.source,/\[(?:[^\[\]\\]|\\[\s\S]|\[(?:[^\[\]\\]|\\[\s\S])*\])*\]/.source,/<(?:[^<>\\]|\\[\s\S]|<(?:[^<>\\]|\\[\s\S])*>)*>/.source].join("|")+")",a=/(?:"(?:\\.|[^"\\\r\n])*"|(?:\b[a-zA-Z_]\w*|[^\s\0-\x7F]+)[?!]?|\$.)/.source;e.languages.insertBefore("ruby","keyword",{"regex-literal":[{pattern:RegExp(/%r/.source+n+/[egimnosux]{0,6}/.source),greedy:!0,inside:{interpolation:t,regex:/[\s\S]+/}},{pattern:/(^|[^/])\/(?!\/)(?:\[[^\r\n\]]+\]|\\.|[^[/\\\r\n])+\/[egimnosux]{0,6}(?=\s*(?:$|[\r\n,.;})#]))/,lookbehind:!0,greedy:!0,inside:{interpolation:t,regex:/[\s\S]+/}}],variable:/[@$]+[a-zA-Z_]\w*(?:[?!]|\b)/,symbol:[{pattern:RegExp(/(^|[^:]):/.source+a),lookbehind:!0,greedy:!0},{pattern:RegExp(/([\r\n{(,][ \t]*)/.source+a+/(?=:(?!:))/.source),lookbehind:!0,greedy:!0}],"method-definition":{pattern:/(\bdef\s+)\w+(?:\s*\.\s*\w+)?/,lookbehind:!0,inside:{function:/\b\w+$/,keyword:/^self\b/,"class-name":/^\w+/,punctuation:/\./}}}),e.languages.insertBefore("ruby","string",{"string-literal":[{pattern:RegExp(/%[qQiIwWs]?/.source+n),greedy:!0,inside:{interpolation:t,string:/[\s\S]+/}},{pattern:/("|')(?:#\{[^}]+\}|#(?!\{)|\\(?:\r\n|[\s\S])|(?!\1)[^\\#\r\n])*\1/,greedy:!0,inside:{interpolation:t,string:/[\s\S]+/}},{pattern:/<<[-~]?([a-z_]\w*)[\r\n](?:.*[\r\n])*?[\t ]*\1/i,alias:"heredoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<[-~]?[a-z_]\w*|\b[a-z_]\w*$/i,inside:{symbol:/\b\w+/,punctuation:/^<<[-~]?/}},interpolation:t,string:/[\s\S]+/}},{pattern:/<<[-~]?'([a-z_]\w*)'[\r\n](?:.*[\r\n])*?[\t ]*\1/i,alias:"heredoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<[-~]?'[a-z_]\w*'|\b[a-z_]\w*$/i,inside:{symbol:/\b\w+/,punctuation:/^<<[-~]?'|'$/}},string:/[\s\S]+/}}],"command-literal":[{pattern:RegExp(/%x/.source+n),greedy:!0,inside:{interpolation:t,command:{pattern:/[\s\S]+/,alias:"string"}}},{pattern:/`(?:#\{[^}]+\}|#(?!\{)|\\(?:\r\n|[\s\S])|[^\\`#\r\n])*`/,greedy:!0,inside:{interpolation:t,command:{pattern:/[\s\S]+/,alias:"string"}}}]}),delete e.languages.ruby.string,e.languages.insertBefore("ruby","number",{builtin:/\b(?:Array|Bignum|Binding|Class|Continuation|Dir|Exception|FalseClass|File|Fixnum|Float|Hash|IO|Integer|MatchData|Method|Module|NilClass|Numeric|Object|Proc|Range|Regexp|Stat|String|Struct|Symbol|TMS|Thread|ThreadGroup|Time|TrueClass)\b/,constant:/\b[A-Z][A-Z0-9_]*(?:[?!]|\b)/}),e.languages.rb=e.languages.ruby}(t),window.Prism=e,t}(),u=e=>t=>t.options.get(e),c=u("codesample_languages"),d=u("codesample_global_prismjs"),g=e=>s.Prism&&d(e)?s.Prism:l,p=e=>t(e)&&"PRE"===e.nodeName&&-1!==e.className.indexOf("language-"),b=e=>{const t=e.selection?e.selection.getNode():null;return p(t)?a.some(t):a.none()},h=e=>{const t=(e=>c(e)||[{text:"HTML/XML",value:"markup"},{text:"JavaScript",value:"javascript"},{text:"CSS",value:"css"},{text:"PHP",value:"php"},{text:"Ruby",value:"ruby"},{text:"Python",value:"python"},{text:"Java",value:"java"},{text:"C",value:"c"},{text:"C#",value:"csharp"},{text:"C++",value:"cpp"}])(e),n=(s=t,(e=>0""),(e=>e.value));var s;const r=((e,t)=>b(e).fold((()=>t),(e=>{const n=e.className.match(/language-(\w+)/);return n?n[1]:t})))(e,n),i=(e=>b(e).bind((e=>a.from(e.textContent))).getOr(""))(e);e.windowManager.open({title:"Insert/Edit Code Sample",size:"large",body:{type:"panel",items:[{type:"listbox",name:"language",label:"Language",items:t},{type:"textarea",name:"code",label:"Code view",spellcheck:!1}]},buttons:[{type:"cancel",name:"cancel",text:"Cancel"},{type:"submit",name:"save",text:"Save",primary:!0}],initialData:{language:r,code:i},onSubmit:t=>{const n=t.getData();((e,t,n)=>{const a=e.dom;e.undoManager.transact((()=>{const s=b(e);return n=o.DOM.encode(n),s.fold((()=>{e.insertContent('
      '+n+"
      ");const s=a.select("#__new")[0];a.setAttrib(s,"id",null),e.selection.select(s)}),(s=>{a.setAttrib(s,"class","language-"+t),s.innerHTML=n,g(e).highlightElement(s),e.selection.select(s)}))}))})(e,n.language,n.code),t.close()}})};var f=tinymce.util.Tools.resolve("tinymce.util.Tools");const m=(e,t=n)=>n=>{const a=()=>{n.setEnabled(e.selection.isEditable()),t(n)};return e.on("NodeChange",a),a(),()=>{e.off("NodeChange",a)}};e.add("codesample",(e=>{(e=>{const t=e.options.register;t("codesample_languages",{processor:"object[]"}),t("codesample_global_prismjs",{processor:"boolean",default:!1})})(e),(e=>{e.on("PreProcess",(t=>{const n=e.dom,a=n.select("pre[contenteditable=false]",t.node);f.each(f.grep(a,p),(e=>{const t=e.textContent;let a;for(n.setAttrib(e,"class",r(n.getAttrib(e,"class"))),n.setAttrib(e,"contentEditable",null),n.setAttrib(e,"data-mce-highlighted",null);a=e.firstChild;)e.removeChild(a);n.add(e,"code").textContent=t}))})),e.on("SetContent",(()=>{const t=e.dom,n=f.grep(t.select("pre"),(e=>p(e)&&"true"!==t.getAttrib(e,"data-mce-highlighted")));n.length&&e.undoManager.transact((()=>{f.each(n,(n=>{var a;f.each(t.select("br",n),(n=>{t.replace(e.getDoc().createTextNode("\n"),n)})),n.innerHTML=t.encode(null!==(a=n.textContent)&&void 0!==a?a:""),g(e).highlightElement(n),t.setAttrib(n,"data-mce-highlighted",!0),n.className=r(n.className)}))}))})),e.on("PreInit",(()=>{e.parser.addNodeFilter("pre",(e=>{var t;for(let n=0,a=e.length;n{const t=()=>e.execCommand("codesample");e.ui.registry.addToggleButton("codesample",{icon:"code-sample",tooltip:"Insert/edit code sample",onAction:t,onSetup:m(e,(t=>{t.setActive((e=>{const t=e.selection.getStart();return e.dom.is(t,'pre[class*="language-"]')})(e))}))}),e.ui.registry.addMenuItem("codesample",{text:"Code sample...",icon:"code-sample",onAction:t,onSetup:m(e)})})(e),(e=>{e.addCommand("codesample",(()=>{const t=e.selection.getNode();e.selection.isCollapsed()||p(t)?h(e):e.formatter.toggle("code")}))})(e),e.on("dblclick",(t=>{p(t.target)&&h(e)}))}))}(); \ No newline at end of file + */return t.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|trait)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:break|catch|continue|do|else|finally|for|function|if|in|instanceof|new|null|return|throw|try|while)\b/,boolean:/\b(?:false|true)\b/,function:/\b\w+(?=\()/,number:/\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/},function(e){function t(e,t){return"___"+e.toUpperCase()+t+"___"}Object.defineProperties(e.languages["markup-templating"]={},{buildPlaceholders:{value:function(n,a,s,r){if(n.language===a){var i=n.tokenStack=[];n.code=n.code.replace(s,function(e){if("function"==typeof r&&!r(e))return e;for(var s,o=i.length;-1!==n.code.indexOf(s=t(a,o));)++o;return i[o]=e,s}),n.grammar=e.languages.markup}}},tokenizePlaceholders:{value:function(n,a){if(n.language===a&&n.tokenStack){n.grammar=e.languages[a];var s=0,r=Object.keys(n.tokenStack);!function i(o){for(var l=0;l=r.length);l++){var u=o[l];if("string"==typeof u||u.content&&"string"==typeof u.content){var c=r[s],d=n.tokenStack[c],g="string"==typeof u?u:u.content,p=t(a,c),b=g.indexOf(p);if(b>-1){++s;var h=g.substring(0,b),m=new e.Token(a,e.tokenize(d,n.grammar),"language-"+a,d),f=g.substring(b+p.length),y=[];h&&y.push.apply(y,i([h])),y.push(m),f&&y.push.apply(y,i([f])),"string"==typeof u?o.splice.apply(o,[l,1].concat(y)):u.content=y}}else u.content&&i(u.content)}return o}(n.tokens)}}}})}(t),t.languages.c=t.languages.extend("clike",{comment:{pattern:/\/\/(?:[^\r\n\\]|\\(?:\r\n?|\n|(?![\r\n])))*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0},"class-name":{pattern:/(\b(?:enum|struct)\s+(?:__attribute__\s*\(\([\s\S]*?\)\)\s*)?)\w+|\b[a-z]\w*_t\b/,lookbehind:!0},keyword:/\b(?:_Alignas|_Alignof|_Atomic|_Bool|_Complex|_Generic|_Imaginary|_Noreturn|_Static_assert|_Thread_local|__attribute__|asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|inline|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|typeof|union|unsigned|void|volatile|while)\b/,function:/\b[a-z_]\w*(?=\s*\()/i,number:/(?:\b0x(?:[\da-f]+(?:\.[\da-f]*)?|\.[\da-f]+)(?:p[+-]?\d+)?|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)[ful]{0,4}/i,operator:/>>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*/%&|^!=<>]=?/}),t.languages.insertBefore("c","string",{char:{pattern:/'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n]){0,32}'/,greedy:!0}}),t.languages.insertBefore("c","string",{macro:{pattern:/(^[\t ]*)#\s*[a-z](?:[^\r\n\\/]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|\\(?:\r\n|[\s\S]))*/im,lookbehind:!0,greedy:!0,alias:"property",inside:{string:[{pattern:/^(#\s*include\s*)<[^>]+>/,lookbehind:!0},t.languages.c.string],char:t.languages.c.char,comment:t.languages.c.comment,"macro-name":[{pattern:/(^#\s*define\s+)\w+\b(?!\()/i,lookbehind:!0},{pattern:/(^#\s*define\s+)\w+\b(?=\()/i,lookbehind:!0,alias:"function"}],directive:{pattern:/^(#\s*)[a-z]+/,lookbehind:!0,alias:"keyword"},"directive-hash":/^#/,punctuation:/##|\\(?=[\r\n])/,expression:{pattern:/\S[\s\S]*/,inside:t.languages.c}}}}),t.languages.insertBefore("c","function",{constant:/\b(?:EOF|NULL|SEEK_CUR|SEEK_END|SEEK_SET|__DATE__|__FILE__|__LINE__|__TIMESTAMP__|__TIME__|__func__|stderr|stdin|stdout)\b/}),delete t.languages.c.boolean,function(e){var t=/\b(?:alignas|alignof|asm|auto|bool|break|case|catch|char|char16_t|char32_t|char8_t|class|co_await|co_return|co_yield|compl|concept|const|const_cast|consteval|constexpr|constinit|continue|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|final|float|for|friend|goto|if|import|inline|int|int16_t|int32_t|int64_t|int8_t|long|module|mutable|namespace|new|noexcept|nullptr|operator|override|private|protected|public|register|reinterpret_cast|requires|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|uint16_t|uint32_t|uint64_t|uint8_t|union|unsigned|using|virtual|void|volatile|wchar_t|while)\b/,n=/\b(?!)\w+(?:\s*\.\s*\w+)*\b/.source.replace(//g,function(){return t.source});e.languages.cpp=e.languages.extend("c",{"class-name":[{pattern:RegExp(/(\b(?:class|concept|enum|struct|typename)\s+)(?!)\w+/.source.replace(//g,function(){return t.source})),lookbehind:!0},/\b[A-Z]\w*(?=\s*::\s*\w+\s*\()/,/\b[A-Z_]\w*(?=\s*::\s*~\w+\s*\()/i,/\b\w+(?=\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>\s*::\s*\w+\s*\()/],keyword:t,number:{pattern:/(?:\b0b[01']+|\b0x(?:[\da-f']+(?:\.[\da-f']*)?|\.[\da-f']+)(?:p[+-]?[\d']+)?|(?:\b[\d']+(?:\.[\d']*)?|\B\.[\d']+)(?:e[+-]?[\d']+)?)[ful]{0,4}/i,greedy:!0},operator:/>>=?|<<=?|->|--|\+\+|&&|\|\||[?:~]|<=>|[-+*/%&|^!=<>]=?|\b(?:and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\b/,boolean:/\b(?:false|true)\b/}),e.languages.insertBefore("cpp","string",{module:{pattern:RegExp(/(\b(?:import|module)\s+)/.source+"(?:"+/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|<[^<>\r\n]*>/.source+"|"+/(?:\s*:\s*)?|:\s*/.source.replace(//g,function(){return n})+")"),lookbehind:!0,greedy:!0,inside:{string:/^[<"][\s\S]+/,operator:/:/,punctuation:/\./}},"raw-string":{pattern:/R"([^()\\ ]{0,16})\([\s\S]*?\)\1"/,alias:"string",greedy:!0}}),e.languages.insertBefore("cpp","keyword",{"generic-function":{pattern:/\b(?!operator\b)[a-z_]\w*\s*<(?:[^<>]|<[^<>]*>)*>(?=\s*\()/i,inside:{function:/^\w+/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:e.languages.cpp}}}}),e.languages.insertBefore("cpp","operator",{"double-colon":{pattern:/::/,alias:"punctuation"}}),e.languages.insertBefore("cpp","class-name",{"base-clause":{pattern:/(\b(?:class|struct)\s+\w+\s*:\s*)[^;{}"'\s]+(?:\s+[^;{}"'\s]+)*(?=\s*[;{])/,lookbehind:!0,greedy:!0,inside:e.languages.extend("cpp",{})}}),e.languages.insertBefore("inside","double-colon",{"class-name":/\b[a-z_]\w*\b(?!\s*::)/i},e.languages.cpp["base-clause"])}(t),function(e){function t(e,t){return e.replace(/<<(\d+)>>/g,function(e,n){return"(?:"+t[+n]+")"})}function n(e,n,a){return RegExp(t(e,n),a||"")}function a(e,t){for(var n=0;n>/g,function(){return"(?:"+e+")"});return e.replace(/<>/g,"[^\\s\\S]")}var s="bool byte char decimal double dynamic float int long object sbyte short string uint ulong ushort var void",r="class enum interface record struct",i="add alias and ascending async await by descending from(?=\\s*(?:\\w|$)) get global group into init(?=\\s*;) join let nameof not notnull on or orderby partial remove select set unmanaged value when where with(?=\\s*{)",o="abstract as base break case catch checked const continue default delegate do else event explicit extern finally fixed for foreach goto if implicit in internal is lock namespace new null operator out override params private protected public readonly ref return sealed sizeof stackalloc static switch this throw try typeof unchecked unsafe using virtual volatile while yield";function l(e){return"\\b(?:"+e.trim().replace(/ /g,"|")+")\\b"}var u=l(r),c=RegExp(l(s+" "+r+" "+i+" "+o)),d=l(r+" "+i+" "+o),g=l(s+" "+r+" "+o),p=a(/<(?:[^<>;=+\-*/%&|^]|<>)*>/.source,2),b=a(/\((?:[^()]|<>)*\)/.source,2),h=/@?\b[A-Za-z_]\w*\b/.source,m=t(/<<0>>(?:\s*<<1>>)?/.source,[h,p]),f=t(/(?!<<0>>)<<1>>(?:\s*\.\s*<<1>>)*/.source,[d,m]),y=/\[\s*(?:,\s*)*\]/.source,w=t(/<<0>>(?:\s*(?:\?\s*)?<<1>>)*(?:\s*\?)?/.source,[f,y]),k=t(/[^,()<>[\];=+\-*/%&|^]|<<0>>|<<1>>|<<2>>/.source,[p,b,y]),v=t(/\(<<0>>+(?:,<<0>>+)+\)/.source,[k]),_=t(/(?:<<0>>|<<1>>)(?:\s*(?:\?\s*)?<<2>>)*(?:\s*\?)?/.source,[v,f,y]),x={keyword:c,punctuation:/[<>()?,.:[\]]/},F=/'(?:[^\r\n'\\]|\\.|\\[Uux][\da-fA-F]{1,8})'/.source,A=/"(?:\\.|[^\\"\r\n])*"/.source,S=/@"(?:""|\\[\s\S]|[^\\"])*"(?!")/.source;e.languages.csharp=e.languages.extend("clike",{string:[{pattern:n(/(^|[^$\\])<<0>>/.source,[S]),lookbehind:!0,greedy:!0},{pattern:n(/(^|[^@$\\])<<0>>/.source,[A]),lookbehind:!0,greedy:!0}],"class-name":[{pattern:n(/(\busing\s+static\s+)<<0>>(?=\s*;)/.source,[f]),lookbehind:!0,inside:x},{pattern:n(/(\busing\s+<<0>>\s*=\s*)<<1>>(?=\s*;)/.source,[h,_]),lookbehind:!0,inside:x},{pattern:n(/(\busing\s+)<<0>>(?=\s*=)/.source,[h]),lookbehind:!0},{pattern:n(/(\b<<0>>\s+)<<1>>/.source,[u,m]),lookbehind:!0,inside:x},{pattern:n(/(\bcatch\s*\(\s*)<<0>>/.source,[f]),lookbehind:!0,inside:x},{pattern:n(/(\bwhere\s+)<<0>>/.source,[h]),lookbehind:!0},{pattern:n(/(\b(?:is(?:\s+not)?|as)\s+)<<0>>/.source,[w]),lookbehind:!0,inside:x},{pattern:n(/\b<<0>>(?=\s+(?!<<1>>|with\s*\{)<<2>>(?:\s*[=,;:{)\]]|\s+(?:in|when)\b))/.source,[_,g,h]),inside:x}],keyword:c,number:/(?:\b0(?:x[\da-f_]*[\da-f]|b[01_]*[01])|(?:\B\.\d+(?:_+\d+)*|\b\d+(?:_+\d+)*(?:\.\d+(?:_+\d+)*)?)(?:e[-+]?\d+(?:_+\d+)*)?)(?:[dflmu]|lu|ul)?\b/i,operator:/>>=?|<<=?|[-=]>|([-+&|])\1|~|\?\?=?|[-+*/%&|^!=<>]=?/,punctuation:/\?\.?|::|[{}[\];(),.:]/}),e.languages.insertBefore("csharp","number",{range:{pattern:/\.\./,alias:"operator"}}),e.languages.insertBefore("csharp","punctuation",{"named-parameter":{pattern:n(/([(,]\s*)<<0>>(?=\s*:)/.source,[h]),lookbehind:!0,alias:"punctuation"}}),e.languages.insertBefore("csharp","class-name",{namespace:{pattern:n(/(\b(?:namespace|using)\s+)<<0>>(?:\s*\.\s*<<0>>)*(?=\s*[;{])/.source,[h]),lookbehind:!0,inside:{punctuation:/\./}},"type-expression":{pattern:n(/(\b(?:default|sizeof|typeof)\s*\(\s*(?!\s))(?:[^()\s]|\s(?!\s)|<<0>>)*(?=\s*\))/.source,[b]),lookbehind:!0,alias:"class-name",inside:x},"return-type":{pattern:n(/<<0>>(?=\s+(?:<<1>>\s*(?:=>|[({]|\.\s*this\s*\[)|this\s*\[))/.source,[_,f]),inside:x,alias:"class-name"},"constructor-invocation":{pattern:n(/(\bnew\s+)<<0>>(?=\s*[[({])/.source,[_]),lookbehind:!0,inside:x,alias:"class-name"},"generic-method":{pattern:n(/<<0>>\s*<<1>>(?=\s*\()/.source,[h,p]),inside:{function:n(/^<<0>>/.source,[h]),generic:{pattern:RegExp(p),alias:"class-name",inside:x}}},"type-list":{pattern:n(/\b((?:<<0>>\s+<<1>>|record\s+<<1>>\s*<<5>>|where\s+<<2>>)\s*:\s*)(?:<<3>>|<<4>>|<<1>>\s*<<5>>|<<6>>)(?:\s*,\s*(?:<<3>>|<<4>>|<<6>>))*(?=\s*(?:where|[{;]|=>|$))/.source,[u,m,h,_,c.source,b,/\bnew\s*\(\s*\)/.source]),lookbehind:!0,inside:{"record-arguments":{pattern:n(/(^(?!new\s*\()<<0>>\s*)<<1>>/.source,[m,b]),lookbehind:!0,greedy:!0,inside:e.languages.csharp},keyword:c,"class-name":{pattern:RegExp(_),greedy:!0,inside:x},punctuation:/[,()]/}},preprocessor:{pattern:/(^[\t ]*)#.*/m,lookbehind:!0,alias:"property",inside:{directive:{pattern:/(#)\b(?:define|elif|else|endif|endregion|error|if|line|nullable|pragma|region|undef|warning)\b/,lookbehind:!0,alias:"keyword"}}}});var $=A+"|"+F,z=t(/\/(?![*/])|\/\/[^\r\n]*[\r\n]|\/\*(?:[^*]|\*(?!\/))*\*\/|<<0>>/.source,[$]),E=a(t(/[^"'/()]|<<0>>|\(<>*\)/.source,[z]),2),C=/\b(?:assembly|event|field|method|module|param|property|return|type)\b/.source,j=t(/<<0>>(?:\s*\(<<1>>*\))?/.source,[f,E]);e.languages.insertBefore("csharp","class-name",{attribute:{pattern:n(/((?:^|[^\s\w>)?])\s*\[\s*)(?:<<0>>\s*:\s*)?<<1>>(?:\s*,\s*<<1>>)*(?=\s*\])/.source,[C,j]),lookbehind:!0,greedy:!0,inside:{target:{pattern:n(/^<<0>>(?=\s*:)/.source,[C]),alias:"keyword"},"attribute-arguments":{pattern:n(/\(<<0>>*\)/.source,[E]),inside:e.languages.csharp},"class-name":{pattern:RegExp(f),inside:{punctuation:/\./}},punctuation:/[:,]/}}});var B=/:[^}\r\n]+/.source,T=a(t(/[^"'/()]|<<0>>|\(<>*\)/.source,[z]),2),P=t(/\{(?!\{)(?:(?![}:])<<0>>)*<<1>>?\}/.source,[T,B]),N=a(t(/[^"'/()]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|<<0>>|\(<>*\)/.source,[$]),2),O=t(/\{(?!\{)(?:(?![}:])<<0>>)*<<1>>?\}/.source,[N,B]);function R(t,a){return{interpolation:{pattern:n(/((?:^|[^{])(?:\{\{)*)<<0>>/.source,[t]),lookbehind:!0,inside:{"format-string":{pattern:n(/(^\{(?:(?![}:])<<0>>)*)<<1>>(?=\}$)/.source,[a,B]),lookbehind:!0,inside:{punctuation:/^:/}},punctuation:/^\{|\}$/,expression:{pattern:/[\s\S]+/,alias:"language-csharp",inside:e.languages.csharp}}},string:/[\s\S]+/}}e.languages.insertBefore("csharp","string",{"interpolation-string":[{pattern:n(/(^|[^\\])(?:\$@|@\$)"(?:""|\\[\s\S]|\{\{|<<0>>|[^\\{"])*"/.source,[P]),lookbehind:!0,greedy:!0,inside:R(P,T)},{pattern:n(/(^|[^@\\])\$"(?:\\.|\{\{|<<0>>|[^\\"{])*"/.source,[O]),lookbehind:!0,greedy:!0,inside:R(O,N)}],char:{pattern:RegExp(F),greedy:!0}}),e.languages.dotnet=e.languages.cs=e.languages.csharp}(t),function(e){var t=/(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/;e.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:RegExp("@[\\w-](?:"+/[^;{\s"']|\s+(?!\s)/.source+"|"+t.source+")*?"+/(?:;|(?=\s*\{))/.source),inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+t.source+"|"+/(?:[^\\\r\n()"']|\\[\s\S])*/.source+")\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+t.source+"$"),alias:"url"}}},selector:{pattern:RegExp("(^|[{}\\s])[^{}\\s](?:[^{};\"'\\s]|\\s+(?![\\s{])|"+t.source+")*(?=\\s*\\{)"),lookbehind:!0},string:{pattern:t,greedy:!0},property:{pattern:/(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,lookbehind:!0},important:/!important\b/i,function:{pattern:/(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,lookbehind:!0},punctuation:/[(){};:,]/},e.languages.css.atrule.inside.rest=e.languages.css;var n=e.languages.markup;n&&(n.tag.addInlined("style","css"),n.tag.addAttribute("style","css"))}(t),function(e){var t=/\b(?:abstract|assert|boolean|break|byte|case|catch|char|class|const|continue|default|do|double|else|enum|exports|extends|final|finally|float|for|goto|if|implements|import|instanceof|int|interface|long|module|native|new|non-sealed|null|open|opens|package|permits|private|protected|provides|public|record(?!\s*[(){}[\]<>=%~.:,;?+\-*/&|^])|requires|return|sealed|short|static|strictfp|super|switch|synchronized|this|throw|throws|to|transient|transitive|try|uses|var|void|volatile|while|with|yield)\b/,n=/(?:[a-z]\w*\s*\.\s*)*(?:[A-Z]\w*\s*\.\s*)*/.source,a={pattern:RegExp(/(^|[^\w.])/.source+n+/[A-Z](?:[\d_A-Z]*[a-z]\w*)?\b/.source),lookbehind:!0,inside:{namespace:{pattern:/^[a-z]\w*(?:\s*\.\s*[a-z]\w*)*(?:\s*\.)?/,inside:{punctuation:/\./}},punctuation:/\./}};e.languages.java=e.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\.|[^"\\\r\n])*"/,lookbehind:!0,greedy:!0},"class-name":[a,{pattern:RegExp(/(^|[^\w.])/.source+n+/[A-Z]\w*(?=\s+\w+\s*[;,=()]|\s*(?:\[[\s,]*\]\s*)?::\s*new\b)/.source),lookbehind:!0,inside:a.inside},{pattern:RegExp(/(\b(?:class|enum|extends|implements|instanceof|interface|new|record|throws)\s+)/.source+n+/[A-Z]\w*\b/.source),lookbehind:!0,inside:a.inside}],keyword:t,function:[e.languages.clike.function,{pattern:/(::\s*)[a-z_]\w*/,lookbehind:!0}],number:/\b0b[01][01_]*L?\b|\b0x(?:\.[\da-f_p+-]+|[\da-f_]+(?:\.[\da-f_p+-]+)?)\b|(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?\d[\d_]*)?[dfl]?/i,operator:{pattern:/(^|[^.])(?:<<=?|>>>?=?|->|--|\+\+|&&|\|\||::|[?:~]|[-+*/%&|^!=<>]=?)/m,lookbehind:!0},constant:/\b[A-Z][A-Z_\d]+\b/}),e.languages.insertBefore("java","string",{"triple-quoted-string":{pattern:/"""[ \t]*[\r\n](?:(?:"|"")?(?:\\.|[^"\\]))*"""/,greedy:!0,alias:"string"},char:{pattern:/'(?:\\.|[^'\\\r\n]){1,6}'/,greedy:!0}}),e.languages.insertBefore("java","class-name",{annotation:{pattern:/(^|[^.])@\w+(?:\s*\.\s*\w+)*/,lookbehind:!0,alias:"punctuation"},generics:{pattern:/<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&))*>)*>)*>)*>/,inside:{"class-name":a,keyword:t,punctuation:/[<>(),.:]/,operator:/[?&|]/}},import:[{pattern:RegExp(/(\bimport\s+)/.source+n+/(?:[A-Z]\w*|\*)(?=\s*;)/.source),lookbehind:!0,inside:{namespace:a.inside.namespace,punctuation:/\./,operator:/\*/,"class-name":/\w+/}},{pattern:RegExp(/(\bimport\s+static\s+)/.source+n+/(?:\w+|\*)(?=\s*;)/.source),lookbehind:!0,alias:"static",inside:{namespace:a.inside.namespace,static:/\b\w+$/,punctuation:/\./,operator:/\*/,"class-name":/\w+/}}],namespace:{pattern:RegExp(/(\b(?:exports|import(?:\s+static)?|module|open|opens|package|provides|requires|to|transitive|uses|with)\s+)(?!)[a-z]\w*(?:\.[a-z]\w*)*\.?/.source.replace(//g,function(){return t.source})),lookbehind:!0,inside:{punctuation:/\./}}})}(t),t.languages.javascript=t.languages.extend("clike",{"class-name":[t.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:{pattern:RegExp(/(^|[^\w$])/.source+"(?:"+/NaN|Infinity/.source+"|"+/0[bB][01]+(?:_[01]+)*n?/.source+"|"+/0[oO][0-7]+(?:_[0-7]+)*n?/.source+"|"+/0[xX][\dA-Fa-f]+(?:_[\dA-Fa-f]+)*n?/.source+"|"+/\d+(?:_\d+)*n/.source+"|"+/(?:\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\.\d+(?:_\d+)*)(?:[Ee][+-]?\d+(?:_\d+)*)?/.source+")"+/(?![\w$])/.source),lookbehind:!0},operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),t.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/,t.languages.insertBefore("javascript","keyword",{regex:{pattern:RegExp(/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)/.source+/\//.source+"(?:"+/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}/.source+"|"+/(?:\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.)*\])*\])*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}v[dgimyus]{0,7}/.source+")"+/(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/.source),lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:t.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:t.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:t.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:t.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:t.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),t.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:t.languages.javascript}},string:/[\s\S]+/}},"string-property":{pattern:/((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,lookbehind:!0,greedy:!0,alias:"property"}}),t.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}}),t.languages.markup&&(t.languages.markup.tag.addInlined("script","javascript"),t.languages.markup.tag.addAttribute(/on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)/.source,"javascript")),t.languages.js=t.languages.javascript,t.languages.markup={comment:{pattern://,greedy:!0},prolog:{pattern:/<\?[\s\S]+?\?>/,greedy:!0},doctype:{pattern:/"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^$|[[\]]/,"doctype-tag":/^DOCTYPE/i,name:/[^\s<>'"]+/}},cdata:{pattern://i,greedy:!0},tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},{pattern:/^(\s*)["']|["']$/,lookbehind:!0}]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]},t.languages.markup.tag.inside["attr-value"].inside.entity=t.languages.markup.entity,t.languages.markup.doctype.inside["internal-subset"].inside=t.languages.markup,t.hooks.add("wrap",function(e){"entity"===e.type&&(e.attributes.title=e.content.replace(/&/,"&"))}),Object.defineProperty(t.languages.markup.tag,"addInlined",{value:function(e,n){var a={};a["language-"+n]={pattern:/(^$)/i,lookbehind:!0,inside:t.languages[n]},a.cdata=/^$/i;var s={"included-cdata":{pattern://i,inside:a}};s["language-"+n]={pattern:/[\s\S]+/,inside:t.languages[n]};var r={};r[e]={pattern:RegExp(/(<__[^>]*>)(?:))*\]\]>|(?!)/.source.replace(/__/g,function(){return e}),"i"),lookbehind:!0,greedy:!0,inside:s},t.languages.insertBefore("markup","cdata",r)}}),Object.defineProperty(t.languages.markup.tag,"addAttribute",{value:function(e,n){t.languages.markup.tag.inside["special-attr"].push({pattern:RegExp(/(^|["'\s])/.source+"(?:"+e+")"+/\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))/.source,"i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[n,"language-"+n],inside:t.languages[n]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}}),t.languages.html=t.languages.markup,t.languages.mathml=t.languages.markup,t.languages.svg=t.languages.markup,t.languages.xml=t.languages.extend("markup",{}),t.languages.ssml=t.languages.xml,t.languages.atom=t.languages.xml,t.languages.rss=t.languages.xml,function(e){var t=/\/\*[\s\S]*?\*\/|\/\/.*|#(?!\[).*/,n=[{pattern:/\b(?:false|true)\b/i,alias:"boolean"},{pattern:/(::\s*)\b[a-z_]\w*\b(?!\s*\()/i,greedy:!0,lookbehind:!0},{pattern:/(\b(?:case|const)\s+)\b[a-z_]\w*(?=\s*[;=])/i,greedy:!0,lookbehind:!0},/\b(?:null)\b/i,/\b[A-Z_][A-Z0-9_]*\b(?!\s*\()/],a=/\b0b[01]+(?:_[01]+)*\b|\b0o[0-7]+(?:_[0-7]+)*\b|\b0x[\da-f]+(?:_[\da-f]+)*\b|(?:\b\d+(?:_\d+)*\.?(?:\d+(?:_\d+)*)?|\B\.\d+)(?:e[+-]?\d+)?/i,s=/|\?\?=?|\.{3}|\??->|[!=]=?=?|::|\*\*=?|--|\+\+|&&|\|\||<<|>>|[?~]|[/^|%*&<>.+-]=?/,r=/[{}\[\](),:;]/;e.languages.php={delimiter:{pattern:/\?>$|^<\?(?:php(?=\s)|=)?/i,alias:"important"},comment:t,variable:/\$+(?:\w+\b|(?=\{))/,package:{pattern:/(namespace\s+|use\s+(?:function\s+)?)(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,lookbehind:!0,inside:{punctuation:/\\/}},"class-name-definition":{pattern:/(\b(?:class|enum|interface|trait)\s+)\b[a-z_]\w*(?!\\)\b/i,lookbehind:!0,alias:"class-name"},"function-definition":{pattern:/(\bfunction\s+)[a-z_]\w*(?=\s*\()/i,lookbehind:!0,alias:"function"},keyword:[{pattern:/(\(\s*)\b(?:array|bool|boolean|float|int|integer|object|string)\b(?=\s*\))/i,alias:"type-casting",greedy:!0,lookbehind:!0},{pattern:/([(,?]\s*)\b(?:array(?!\s*\()|bool|callable|(?:false|null)(?=\s*\|)|float|int|iterable|mixed|object|self|static|string)\b(?=\s*\$)/i,alias:"type-hint",greedy:!0,lookbehind:!0},{pattern:/(\)\s*:\s*(?:\?\s*)?)\b(?:array(?!\s*\()|bool|callable|(?:false|null)(?=\s*\|)|float|int|iterable|mixed|never|object|self|static|string|void)\b/i,alias:"return-type",greedy:!0,lookbehind:!0},{pattern:/\b(?:array(?!\s*\()|bool|float|int|iterable|mixed|object|string|void)\b/i,alias:"type-declaration",greedy:!0},{pattern:/(\|\s*)(?:false|null)\b|\b(?:false|null)(?=\s*\|)/i,alias:"type-declaration",greedy:!0,lookbehind:!0},{pattern:/\b(?:parent|self|static)(?=\s*::)/i,alias:"static-context",greedy:!0},{pattern:/(\byield\s+)from\b/i,lookbehind:!0},/\bclass\b/i,{pattern:/((?:^|[^\s>:]|(?:^|[^-])>|(?:^|[^:]):)\s*)\b(?:abstract|and|array|as|break|callable|case|catch|clone|const|continue|declare|default|die|do|echo|else|elseif|empty|enddeclare|endfor|endforeach|endif|endswitch|endwhile|enum|eval|exit|extends|final|finally|fn|for|foreach|function|global|goto|if|implements|include|include_once|instanceof|insteadof|interface|isset|list|match|namespace|never|new|or|parent|print|private|protected|public|readonly|require|require_once|return|self|static|switch|throw|trait|try|unset|use|var|while|xor|yield|__halt_compiler)\b/i,lookbehind:!0}],"argument-name":{pattern:/([(,]\s*)\b[a-z_]\w*(?=\s*:(?!:))/i,lookbehind:!0},"class-name":[{pattern:/(\b(?:extends|implements|instanceof|new(?!\s+self|\s+static))\s+|\bcatch\s*\()\b[a-z_]\w*(?!\\)\b/i,greedy:!0,lookbehind:!0},{pattern:/(\|\s*)\b[a-z_]\w*(?!\\)\b/i,greedy:!0,lookbehind:!0},{pattern:/\b[a-z_]\w*(?!\\)\b(?=\s*\|)/i,greedy:!0},{pattern:/(\|\s*)(?:\\?\b[a-z_]\w*)+\b/i,alias:"class-name-fully-qualified",greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/(?:\\?\b[a-z_]\w*)+\b(?=\s*\|)/i,alias:"class-name-fully-qualified",greedy:!0,inside:{punctuation:/\\/}},{pattern:/(\b(?:extends|implements|instanceof|new(?!\s+self\b|\s+static\b))\s+|\bcatch\s*\()(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,alias:"class-name-fully-qualified",greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/\b[a-z_]\w*(?=\s*\$)/i,alias:"type-declaration",greedy:!0},{pattern:/(?:\\?\b[a-z_]\w*)+(?=\s*\$)/i,alias:["class-name-fully-qualified","type-declaration"],greedy:!0,inside:{punctuation:/\\/}},{pattern:/\b[a-z_]\w*(?=\s*::)/i,alias:"static-context",greedy:!0},{pattern:/(?:\\?\b[a-z_]\w*)+(?=\s*::)/i,alias:["class-name-fully-qualified","static-context"],greedy:!0,inside:{punctuation:/\\/}},{pattern:/([(,?]\s*)[a-z_]\w*(?=\s*\$)/i,alias:"type-hint",greedy:!0,lookbehind:!0},{pattern:/([(,?]\s*)(?:\\?\b[a-z_]\w*)+(?=\s*\$)/i,alias:["class-name-fully-qualified","type-hint"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/(\)\s*:\s*(?:\?\s*)?)\b[a-z_]\w*(?!\\)\b/i,alias:"return-type",greedy:!0,lookbehind:!0},{pattern:/(\)\s*:\s*(?:\?\s*)?)(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,alias:["class-name-fully-qualified","return-type"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}}],constant:n,function:{pattern:/(^|[^\\\w])\\?[a-z_](?:[\w\\]*\w)?(?=\s*\()/i,lookbehind:!0,inside:{punctuation:/\\/}},property:{pattern:/(->\s*)\w+/,lookbehind:!0},number:a,operator:s,punctuation:r};var i={pattern:/\{\$(?:\{(?:\{[^{}]+\}|[^{}]+)\}|[^{}])+\}|(^|[^\\{])\$+(?:\w+(?:\[[^\r\n\[\]]+\]|->\w+)?)/,lookbehind:!0,inside:e.languages.php},o=[{pattern:/<<<'([^']+)'[\r\n](?:.*[\r\n])*?\1;/,alias:"nowdoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<<'[^']+'|[a-z_]\w*;$/i,alias:"symbol",inside:{punctuation:/^<<<'?|[';]$/}}}},{pattern:/<<<(?:"([^"]+)"[\r\n](?:.*[\r\n])*?\1;|([a-z_]\w*)[\r\n](?:.*[\r\n])*?\2;)/i,alias:"heredoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<<(?:"[^"]+"|[a-z_]\w*)|[a-z_]\w*;$/i,alias:"symbol",inside:{punctuation:/^<<<"?|[";]$/}},interpolation:i}},{pattern:/`(?:\\[\s\S]|[^\\`])*`/,alias:"backtick-quoted-string",greedy:!0},{pattern:/'(?:\\[\s\S]|[^\\'])*'/,alias:"single-quoted-string",greedy:!0},{pattern:/"(?:\\[\s\S]|[^\\"])*"/,alias:"double-quoted-string",greedy:!0,inside:{interpolation:i}}];e.languages.insertBefore("php","variable",{string:o,attribute:{pattern:/#\[(?:[^"'\/#]|\/(?![*/])|\/\/.*$|#(?!\[).*$|\/\*(?:[^*]|\*(?!\/))*\*\/|"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*')+\](?=\s*[a-z$#])/im,greedy:!0,inside:{"attribute-content":{pattern:/^(#\[)[\s\S]+(?=\]$)/,lookbehind:!0,inside:{comment:t,string:o,"attribute-class-name":[{pattern:/([^:]|^)\b[a-z_]\w*(?!\\)\b/i,alias:"class-name",greedy:!0,lookbehind:!0},{pattern:/([^:]|^)(?:\\?\b[a-z_]\w*)+/i,alias:["class-name","class-name-fully-qualified"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}}],constant:n,number:a,operator:s,punctuation:r}},delimiter:{pattern:/^#\[|\]$/,alias:"punctuation"}}}}),e.hooks.add("before-tokenize",function(t){/<\?/.test(t.code)&&e.languages["markup-templating"].buildPlaceholders(t,"php",/<\?(?:[^"'/#]|\/(?![*/])|("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|(?:\/\/|#(?!\[))(?:[^?\n\r]|\?(?!>))*(?=$|\?>|[\r\n])|#\[|\/\*(?:[^*]|\*(?!\/))*(?:\*\/|$))*?(?:\?>|$)/g)}),e.hooks.add("after-tokenize",function(t){e.languages["markup-templating"].tokenizePlaceholders(t,"php")})}(t),t.languages.python={comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0,greedy:!0},"string-interpolation":{pattern:/(?:f|fr|rf)(?:("""|''')[\s\S]*?\1|("|')(?:\\.|(?!\2)[^\\\r\n])*\2)/i,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^{])(?:\{\{)*)\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}])+\})+\})+\}/,lookbehind:!0,inside:{"format-spec":{pattern:/(:)[^:(){}]+(?=\}$)/,lookbehind:!0},"conversion-option":{pattern:/![sra](?=[:}]$)/,alias:"punctuation"},rest:null}},string:/[\s\S]+/}},"triple-quoted-string":{pattern:/(?:[rub]|br|rb)?("""|''')[\s\S]*?\1/i,greedy:!0,alias:"string"},string:{pattern:/(?:[rub]|br|rb)?("|')(?:\\.|(?!\1)[^\\\r\n])*\1/i,greedy:!0},function:{pattern:/((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/g,lookbehind:!0},"class-name":{pattern:/(\bclass\s+)\w+/i,lookbehind:!0},decorator:{pattern:/(^[\t ]*)@\w+(?:\.\w+)*/m,lookbehind:!0,alias:["annotation","punctuation"],inside:{punctuation:/\./}},keyword:/\b(?:_(?=\s*:)|and|as|assert|async|await|break|case|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|match|nonlocal|not|or|pass|print|raise|return|try|while|with|yield)\b/,builtin:/\b(?:__import__|abs|all|any|apply|ascii|basestring|bin|bool|buffer|bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|memoryview|min|next|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|unichr|unicode|vars|xrange|zip)\b/,boolean:/\b(?:False|None|True)\b/,number:/\b0(?:b(?:_?[01])+|o(?:_?[0-7])+|x(?:_?[a-f0-9])+)\b|(?:\b\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\B\.\d+(?:_\d+)*)(?:e[+-]?\d+(?:_\d+)*)?j?(?!\w)/i,operator:/[-+%=]=?|!=|:=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,punctuation:/[{}[\];(),.:]/},t.languages.python["string-interpolation"].inside.interpolation.inside.rest=t.languages.python,t.languages.py=t.languages.python,function(e){e.languages.ruby=e.languages.extend("clike",{comment:{pattern:/#.*|^=begin\s[\s\S]*?^=end/m,greedy:!0},"class-name":{pattern:/(\b(?:class|module)\s+|\bcatch\s+\()[\w.\\]+|\b[A-Z_]\w*(?=\s*\.\s*new\b)/,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:BEGIN|END|alias|and|begin|break|case|class|def|define_method|defined|do|each|else|elsif|end|ensure|extend|for|if|in|include|module|new|next|nil|not|or|prepend|private|protected|public|raise|redo|require|rescue|retry|return|self|super|then|throw|undef|unless|until|when|while|yield)\b/,operator:/\.{2,3}|&\.|===||[!=]?~|(?:&&|\|\||<<|>>|\*\*|[+\-*/%<>!^&|=])=?|[?:]/,punctuation:/[(){}[\].,;]/}),e.languages.insertBefore("ruby","operator",{"double-colon":{pattern:/::/,alias:"punctuation"}});var t={pattern:/((?:^|[^\\])(?:\\{2})*)#\{(?:[^{}]|\{[^{}]*\})*\}/,lookbehind:!0,inside:{content:{pattern:/^(#\{)[\s\S]+(?=\}$)/,lookbehind:!0,inside:e.languages.ruby},delimiter:{pattern:/^#\{|\}$/,alias:"punctuation"}}};delete e.languages.ruby.function;var n="(?:"+[/([^a-zA-Z0-9\s{(\[<=])(?:(?!\1)[^\\]|\\[\s\S])*\1/.source,/\((?:[^()\\]|\\[\s\S]|\((?:[^()\\]|\\[\s\S])*\))*\)/.source,/\{(?:[^{}\\]|\\[\s\S]|\{(?:[^{}\\]|\\[\s\S])*\})*\}/.source,/\[(?:[^\[\]\\]|\\[\s\S]|\[(?:[^\[\]\\]|\\[\s\S])*\])*\]/.source,/<(?:[^<>\\]|\\[\s\S]|<(?:[^<>\\]|\\[\s\S])*>)*>/.source].join("|")+")",a=/(?:"(?:\\.|[^"\\\r\n])*"|(?:\b[a-zA-Z_]\w*|[^\s\0-\x7F]+)[?!]?|\$.)/.source;e.languages.insertBefore("ruby","keyword",{"regex-literal":[{pattern:RegExp(/%r/.source+n+/[egimnosux]{0,6}/.source),greedy:!0,inside:{interpolation:t,regex:/[\s\S]+/}},{pattern:/(^|[^/])\/(?!\/)(?:\[[^\r\n\]]+\]|\\.|[^[/\\\r\n])+\/[egimnosux]{0,6}(?=\s*(?:$|[\r\n,.;})#]))/,lookbehind:!0,greedy:!0,inside:{interpolation:t,regex:/[\s\S]+/}}],variable:/[@$]+[a-zA-Z_]\w*(?:[?!]|\b)/,symbol:[{pattern:RegExp(/(^|[^:]):/.source+a),lookbehind:!0,greedy:!0},{pattern:RegExp(/([\r\n{(,][ \t]*)/.source+a+/(?=:(?!:))/.source),lookbehind:!0,greedy:!0}],"method-definition":{pattern:/(\bdef\s+)\w+(?:\s*\.\s*\w+)?/,lookbehind:!0,inside:{function:/\b\w+$/,keyword:/^self\b/,"class-name":/^\w+/,punctuation:/\./}}}),e.languages.insertBefore("ruby","string",{"string-literal":[{pattern:RegExp(/%[qQiIwWs]?/.source+n),greedy:!0,inside:{interpolation:t,string:/[\s\S]+/}},{pattern:/("|')(?:#\{[^}]+\}|#(?!\{)|\\(?:\r\n|[\s\S])|(?!\1)[^\\#\r\n])*\1/,greedy:!0,inside:{interpolation:t,string:/[\s\S]+/}},{pattern:/<<[-~]?([a-z_]\w*)[\r\n](?:.*[\r\n])*?[\t ]*\1/i,alias:"heredoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<[-~]?[a-z_]\w*|\b[a-z_]\w*$/i,inside:{symbol:/\b\w+/,punctuation:/^<<[-~]?/}},interpolation:t,string:/[\s\S]+/}},{pattern:/<<[-~]?'([a-z_]\w*)'[\r\n](?:.*[\r\n])*?[\t ]*\1/i,alias:"heredoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<[-~]?'[a-z_]\w*'|\b[a-z_]\w*$/i,inside:{symbol:/\b\w+/,punctuation:/^<<[-~]?'|'$/}},string:/[\s\S]+/}}],"command-literal":[{pattern:RegExp(/%x/.source+n),greedy:!0,inside:{interpolation:t,command:{pattern:/[\s\S]+/,alias:"string"}}},{pattern:/`(?:#\{[^}]+\}|#(?!\{)|\\(?:\r\n|[\s\S])|[^\\`#\r\n])*`/,greedy:!0,inside:{interpolation:t,command:{pattern:/[\s\S]+/,alias:"string"}}}]}),delete e.languages.ruby.string,e.languages.insertBefore("ruby","number",{builtin:/\b(?:Array|Bignum|Binding|Class|Continuation|Dir|Exception|FalseClass|File|Fixnum|Float|Hash|IO|Integer|MatchData|Method|Module|NilClass|Numeric|Object|Proc|Range|Regexp|Stat|String|Struct|Symbol|TMS|Thread|ThreadGroup|Time|TrueClass)\b/,constant:/\b[A-Z][A-Z0-9_]*(?:[?!]|\b)/}),e.languages.rb=e.languages.ruby}(t),window.Prism=e,t}(),u=e=>t=>t.options.get(e),c=u("codesample_languages"),d=u("codesample_global_prismjs"),g=e=>s.Prism&&d(e)?s.Prism:l,p=e=>t(e)&&"PRE"===e.nodeName&&-1!==e.className.indexOf("language-"),b=e=>{const t=e.selection?e.selection.getNode():null;return p(t)?a.some(t):a.none()},h=e=>{const t=(e=>c(e)||[{text:"HTML/XML",value:"markup"},{text:"JavaScript",value:"javascript"},{text:"CSS",value:"css"},{text:"PHP",value:"php"},{text:"Ruby",value:"ruby"},{text:"Python",value:"python"},{text:"Java",value:"java"},{text:"C",value:"c"},{text:"C#",value:"csharp"},{text:"C++",value:"cpp"}])(e),n=(s=t,(e=>0"",e=>e.value);var s;const r=((e,t)=>b(e).fold(()=>t,e=>{const n=e.className.match(/language-(\w+)/);return n?n[1]:t}))(e,n),i=(e=>b(e).bind(e=>a.from(e.textContent)).getOr(""))(e);e.windowManager.open({title:"Insert/Edit Code Sample",size:"large",body:{type:"panel",items:[{type:"listbox",name:"language",label:"Language",items:t},{type:"textarea",name:"code",label:"Code view",spellcheck:!1}]},buttons:[{type:"cancel",name:"cancel",text:"Cancel"},{type:"submit",name:"save",text:"Save",primary:!0}],initialData:{language:r,code:i},onSubmit:t=>{const n=t.getData();((e,t,n)=>{const a=e.dom;e.undoManager.transact(()=>{const s=b(e);return n=o.DOM.encode(n),s.fold(()=>{e.insertContent('
      '+n+"
      ");const s=a.select("#__new")[0];a.setAttrib(s,"id",null),e.selection.select(s)},s=>{a.setAttrib(s,"class","language-"+t),s.innerHTML=n,g(e).highlightElement(s),e.selection.select(s)})})})(e,n.language,n.code),t.close()}})};var m=tinymce.util.Tools.resolve("tinymce.util.Tools");const f=(e,t=n)=>n=>{const a=()=>{n.setEnabled(e.selection.isEditable()),t(n)};return e.on("NodeChange",a),a(),()=>{e.off("NodeChange",a)}},y="codesample";e.add(y,e=>((e=>{const t=e.options.register;t("codesample_languages",{processor:"object[]"}),t("codesample_global_prismjs",{processor:"boolean",default:!1})})(e),(e=>{e.on("PreProcess",t=>{const n=e.dom,a=n.select("pre[contenteditable=false]",t.node);m.each(m.grep(a,p),e=>{const t=e.textContent;let a;for(n.setAttrib(e,"class",r(n.getAttrib(e,"class"))),n.setAttrib(e,"contentEditable",null),n.setAttrib(e,"data-mce-highlighted",null);a=e.firstChild;)e.removeChild(a);n.add(e,"code").textContent=t})}),e.on("SetContent",()=>{const t=e.dom,n=m.grep(t.select("pre"),e=>p(e)&&"true"!==t.getAttrib(e,"data-mce-highlighted"));n.length&&e.undoManager.transact(()=>{m.each(n,n=>{m.each(t.select("br",n),n=>{t.replace(e.getDoc().createTextNode("\n"),n)}),n.innerHTML=t.encode(n.textContent??""),g(e).highlightElement(n),t.setAttrib(n,"data-mce-highlighted",!0),n.className=r(n.className)})})}),e.on("PreInit",()=>{e.parser.addNodeFilter("pre",e=>{for(let t=0,n=e.length;t{const t=()=>e.execCommand("codesample");e.ui.registry.addToggleButton("codesample",{icon:"code-sample",tooltip:"Insert/edit code sample",onAction:t,onSetup:f(e,t=>{t.setActive((e=>{const t=e.selection.getStart();return e.dom.is(t,'pre[class*="language-"]')})(e))})}),e.ui.registry.addMenuItem("codesample",{text:"Code sample...",icon:"code-sample",onAction:t,onSetup:f(e)})})(e),(e=>{e.addCommand("codesample",()=>{const t=e.selection.getNode();e.selection.isCollapsed()||p(t)?h(e):e.formatter.toggle("code")})})(e),e.on("dblclick",t=>{p(t.target)&&h(e)}),{getMetadata:()=>({name:"Code Sample",type:"opensource",slug:y})}))}(); \ No newline at end of file diff --git a/public/assets/tinymce/plugins/directionality/plugin.js b/public/assets/tinymce/plugins/directionality/plugin.js index 008e2608a..c2421b4c2 100644 --- a/public/assets/tinymce/plugins/directionality/plugin.js +++ b/public/assets/tinymce/plugins/directionality/plugin.js @@ -1,5 +1,5 @@ /** - * TinyMCE version 8.1.2 (TBD) + * TinyMCE version 8.10.0 (2026-10-14) */ (function () { @@ -9,13 +9,12 @@ /* eslint-disable @typescript-eslint/no-wrapper-object-types */ const hasProto = (v, constructor, predicate) => { - var _a; if (predicate(v, constructor.prototype)) { return true; } else { // String-based fallback time - return ((_a = v.constructor) === null || _a === void 0 ? void 0 : _a.name) === constructor.name; + return v.constructor?.name === constructor.name; } }; const typeOf = (x) => { @@ -49,6 +48,9 @@ return value; }; }; + const tripleEquals = (a, b) => { + return a === b; + }; const never = constant(false); /** @@ -67,6 +69,11 @@ * strict-null-checks */ class Optional { + tag; + value; + // Sneaky optimisation: every instance of Optional.none is identical, so just + // reuse the same object + static singletonNone = new Optional(false); // The internal representation has a `tag` and a `value`, but both are // private: able to be console.logged, but not able to be accessed by code constructor(tag, value) { @@ -234,7 +241,7 @@ */ getOrDie(message) { if (!this.tag) { - throw new Error(message !== null && message !== void 0 ? message : 'Called getOrDie on None'); + throw new Error(message ?? 'Called getOrDie on None'); } else { return this.value; @@ -298,9 +305,6 @@ return this.tag ? `some(${this.value})` : 'none()'; } } - // Sneaky optimisation: every instance of Optional.none is identical, so just - // reuse the same object - Optional.singletonNone = new Optional(false); const nativeSlice = Array.prototype.slice; const map = (xs, f) => { @@ -335,6 +339,16 @@ }; isFunction(Array.from) ? Array.from : (x) => nativeSlice.call(x); + /** + * **Is** the value stored inside this Optional object equal to `rhs`? + */ + const is$1 = (lhs, rhs, comparator = tripleEquals) => lhs.exists((left) => comparator(left, rhs)); + + const blank = (r) => (s) => s.replace(r, ''); + /** removes all leading and trailing spaces */ + const trim = blank(/^\s+|\s+$/g); + const isNotEmpty = (s) => s.length > 0; + const fromHtml = (html, scope) => { const doc = scope || document; const div = doc.createElement('div'); @@ -417,7 +431,6 @@ const isDocumentFragment = isType(DOCUMENT_FRAGMENT); const isTag = (tag) => (e) => isElement(e) && name(e) === tag; - const parent = (element) => Optional.from(element.dom.parentNode).map(SugarElement.fromDom); const children$2 = (element) => map(element.dom.childNodes, SugarElement.fromDom); /** @@ -458,7 +471,13 @@ const set = (element, key, value) => { rawSet(element.dom, key, value); }; - const remove = (element, key) => { + const get$1 = (element, key) => { + const v = element.dom.getAttribute(key); + // undefined is the more appropriate value for JS, and this matches JQuery + return v === null ? undefined : v; + }; + const getOpt = (element, key) => Optional.from(get$1(element, key)); + const remove$1 = (element, key) => { element.dom.removeAttribute(key); }; @@ -481,6 +500,17 @@ return getShadowRoot(SugarElement.fromDom(dom)).fold(() => doc.body.contains(dom), compose1(inBody, getShadowHost)); }; + const internalRemove = (dom, property) => { + /* + * IE9 and above - MDN doesn't have details, but here's a couple of random internet claims + * + * http://help.dottoro.com/ljopsjck.php + * http://stackoverflow.com/a/7901886/7546 + */ + if (isSupported(dom)) { + dom.style.removeProperty(property); + } + }; /* * NOTE: For certain properties, this returns the "used value" which is subtly different to the "computed value" (despite calling getComputedStyle). * Blame CSS 2.0. @@ -507,6 +537,14 @@ // removed: support for dom().style[property] where prop is camel case instead of normal property name // empty string is what the browsers (IE11 and Chrome) return when the propertyValue doesn't exists. const getUnsafeProperty = (dom, property) => isSupported(dom) ? dom.style.getPropertyValue(property) : ''; + const remove = (element, property) => { + const dom = element.dom; + internalRemove(dom, property); + if (is$1(getOpt(element, 'style').map(trim), '')) { + // No more styles left, remove the style attribute as well + remove$1(element, 'style'); + } + }; const getDirection = (element) => get(element, 'direction') === 'rtl' ? 'rtl' : 'ltr'; @@ -535,7 +573,6 @@ // TODO: Avoid all the wrapping and unwrapping children$1(scope, (e) => is(e, selector)); - const getParentElement = (element) => parent(element).filter(isElement); // if the block is a list item, we need to get the parent of the list itself const getNormalizedBlock = (element, isListItem) => { const normalizedElement = isListItem ? ancestor(element, 'ol,ul') : Optional.some(element); @@ -547,32 +584,29 @@ const blockElement = SugarElement.fromDom(block); const isBlockElementListItem = isListItem(blockElement); const normalizedBlock = getNormalizedBlock(blockElement, isBlockElementListItem); - const normalizedBlockParent = getParentElement(normalizedBlock); - normalizedBlockParent.each((parent) => { - // TINY-9314: Remove any inline direction style to ensure that it is only set when necessary and that - // the dir attribute is favored - dom.setStyle(normalizedBlock.dom, 'direction', null); - const parentDirection = getDirection(parent); - if (parentDirection === dir) { - remove(normalizedBlock, 'dir'); - } - else { - set(normalizedBlock, 'dir', dir); - } - // TINY-9314: Set an inline direction style if computed css direction is still not as desired. This can - // happen when the direction style is derived from a stylesheet. - if (getDirection(normalizedBlock) !== dir) { + const attrDir = get$1(normalizedBlock, 'dir'); + const styleDir = Optional.from(dom.getStyle(normalizedBlock.dom, 'direction', false)) + .filter(isNotEmpty); + if (attrDir === dir || styleDir.exists((d) => d === dir)) { + // If already set to given dir, toggle dir off + remove$1(normalizedBlock, 'dir'); + remove(normalizedBlock, 'direction'); + } + else if (attrDir !== dir) { + set(normalizedBlock, 'dir', dir); // Set the dir attribute to the desired direction + if (styleDir.exists((d) => d !== dir) || getDirection(normalizedBlock) !== dir) { + // Also set the inline direction style if it was already set or if necessary to override inherited direction dom.setStyle(normalizedBlock.dom, 'direction', dir); } - // Remove dir attr and direction style from list children - if (isBlockElementListItem) { - const listItems = children(normalizedBlock, 'li[dir],li[style]'); - each(listItems, (listItem) => { - remove(listItem, 'dir'); - dom.setStyle(listItem.dom, 'direction', null); - }); - } - }); + } + // Remove dir attr and direction style from list children + if (isBlockElementListItem) { + const listItems = children(normalizedBlock, 'li[dir],li[style]'); + each(listItems, (listItem) => { + remove$1(listItem, 'dir'); + dom.setStyle(listItem.dom, 'direction', null); + }); + } }); }; const setDir = (editor, dir) => { @@ -591,35 +625,42 @@ }); }; - const getNodeChangeHandler = (editor, dir) => (api) => { - const nodeChangeHandler = (e) => { - const element = SugarElement.fromDom(e.element); - api.setActive(getDirection(element) === dir); - api.setEnabled(editor.selection.isEditable()); - }; - editor.on('NodeChange', nodeChangeHandler); - api.setEnabled(editor.selection.isEditable()); - return () => editor.off('NodeChange', nodeChangeHandler); - }; const register = (editor) => { + const setupHandler = (dir) => (api) => { + const nodeChangeHandler = (e) => { + const block = editor.dom.isBlock(e.element) ? e.element : editor.dom.getParent(e.element, editor.dom.isBlock); + if (block) { + const direction = editor.dom.getStyle(block, 'direction') || editor.dom.getAttrib(block, 'dir'); + api.setActive(direction === dir); + } + }; + editor.on('NodeChange', nodeChangeHandler); + return () => editor.off('NodeChange', nodeChangeHandler); + }; editor.ui.registry.addToggleButton('ltr', { tooltip: 'Left to right', icon: 'ltr', + context: 'editable', onAction: () => editor.execCommand('mceDirectionLTR'), - onSetup: getNodeChangeHandler(editor, 'ltr') + onSetup: setupHandler('ltr'), }); editor.ui.registry.addToggleButton('rtl', { tooltip: 'Right to left', icon: 'rtl', + context: 'editable', onAction: () => editor.execCommand('mceDirectionRTL'), - onSetup: getNodeChangeHandler(editor, 'rtl') + onSetup: setupHandler('rtl') }); }; + const PLUGIN_CODE = 'directionality'; var Plugin = () => { - global.add('directionality', (editor) => { + global.add(PLUGIN_CODE, (editor) => { register$1(editor); register(editor); + return { + getMetadata: () => ({ name: 'Directionality', type: 'opensource', slug: PLUGIN_CODE }) + }; }); }; diff --git a/public/assets/tinymce/plugins/directionality/plugin.min.js b/public/assets/tinymce/plugins/directionality/plugin.min.js index 95823fd87..3017ea7a2 100644 --- a/public/assets/tinymce/plugins/directionality/plugin.min.js +++ b/public/assets/tinymce/plugins/directionality/plugin.min.js @@ -1 +1 @@ -!function(){"use strict";var t=tinymce.util.Tools.resolve("tinymce.PluginManager");const e=t=>e=>typeof e===t,r=t=>"string"===(t=>{const e=typeof t;return null===t?"null":"object"===e&&Array.isArray(t)?"array":"object"===e&&(r=o=t,(n=String).prototype.isPrototypeOf(r)||(null===(i=o.constructor)||void 0===i?void 0:i.name)===n.name)?"string":e;var r,o,n,i})(t),o=e("boolean"),n=t=>!(t=>null==t)(t),i=e("function"),s=e("number"),l=()=>false;class a{constructor(t,e){this.tag=t,this.value=e}static some(t){return new a(!0,t)}static none(){return a.singletonNone}fold(t,e){return this.tag?e(this.value):t()}isSome(){return this.tag}isNone(){return!this.tag}map(t){return this.tag?a.some(t(this.value)):a.none()}bind(t){return this.tag?t(this.value):a.none()}exists(t){return this.tag&&t(this.value)}forall(t){return!this.tag||t(this.value)}filter(t){return!this.tag||t(this.value)?this:a.none()}getOr(t){return this.tag?this.value:t}or(t){return this.tag?this:t}getOrThunk(t){return this.tag?this.value:t()}orThunk(t){return this.tag?this:t()}getOrDie(t){if(this.tag)return this.value;throw new Error(null!=t?t:"Called getOrDie on None")}static from(t){return n(t)?a.some(t):a.none()}getOrNull(){return this.tag?this.value:null}getOrUndefined(){return this.value}each(t){this.tag&&t(this.value)}toArray(){return this.tag?[this.value]:[]}toString(){return this.tag?`some(${this.value})`:"none()"}}a.singletonNone=new a(!1),Array.prototype.slice;const u=(t,e)=>{for(let r=0,o=t.length;r{if(null==t)throw new Error("Node cannot be null or undefined");return{dom:t}},d=c,h=(t,e)=>{const r=t.dom;if(1!==r.nodeType)return!1;{const t=r;if(void 0!==t.matches)return t.matches(e);if(void 0!==t.msMatchesSelector)return t.msMatchesSelector(e);if(void 0!==t.webkitMatchesSelector)return t.webkitMatchesSelector(e);if(void 0!==t.mozMatchesSelector)return t.mozMatchesSelector(e);throw new Error("Browser lacks native selectors")}},m=t=>e=>(t=>t.dom.nodeType)(e)===t,g=m(1),f=m(3),v=m(11),y=t=>d(t.dom.host),p=(t,e)=>{t.dom.removeAttribute(e)},w=t=>{const e=f(t)?t.dom.parentNode:t.dom;if(null==e||null===e.ownerDocument)return!1;const r=e.ownerDocument;return(t=>{const e=(t=>d(t.dom.getRootNode()))(t);return v(r=e)&&n(r.dom.host)?a.some(e):a.none();var r})(d(e)).fold((()=>r.body.contains(e)),(o=w,i=y,t=>o(i(t))));var o,i},b=t=>"rtl"===((t,e)=>{const r=t.dom,o=window.getComputedStyle(r).getPropertyValue(e);return""!==o||w(t)?o:((t,e)=>(t=>void 0!==t.style&&i(t.style.getPropertyValue))(t)?t.style.getPropertyValue(e):"")(r,e)})(t,"direction")?"rtl":"ltr",S=(t,e)=>(t=>((t,e)=>{const r=[];for(let o=0,n=t.length;o{const r=t.length,o=new Array(r);for(let n=0;nh(t,e))))(t),N=t=>g(t)&&"li"===t.dom.nodeName.toLowerCase();const A=(t,e,n)=>{u(e,(e=>{const c=d(e),m=N(c),f=((t,e)=>{return(e?(r=t,o="ol,ul",((t,e,r)=>{let n=t.dom;const s=i(r)?r:l;for(;n.parentNode;){n=n.parentNode;const t=d(n);if(h(t,o))return a.some(t);if(s(t))break}return a.none()})(r,0,n)):a.some(t)).getOr(t);var r,o,n})(c,m);var v;(v=f,(t=>a.from(t.dom.parentNode).map(d))(v).filter(g)).each((e=>{if(t.setStyle(f.dom,"direction",null),b(e)===n?p(f,"dir"):((t,e,n)=>{((t,e,n)=>{if(!(r(n)||o(n)||s(n)))throw console.error("Invalid call to Attribute.set. Key ",e,":: Value ",n,":: Element ",t),new Error("Attribute value was not simple");t.setAttribute(e,n+"")})(t.dom,e,n)})(f,"dir",n),b(f)!==n&&t.setStyle(f.dom,"direction",n),m){const e=S(f,"li[dir],li[style]");u(e,(e=>{p(e,"dir"),t.setStyle(e.dom,"direction",null)}))}}))}))},T=(t,e)=>{t.selection.isEditable()&&(A(t.dom,t.selection.getSelectedBlocks(),e),t.nodeChanged())},C=(t,e)=>r=>{const o=o=>{const n=d(o.element);r.setActive(b(n)===e),r.setEnabled(t.selection.isEditable())};return t.on("NodeChange",o),r.setEnabled(t.selection.isEditable()),()=>t.off("NodeChange",o)};t.add("directionality",(t=>{(t=>{t.addCommand("mceDirectionLTR",(()=>{T(t,"ltr")})),t.addCommand("mceDirectionRTL",(()=>{T(t,"rtl")}))})(t),(t=>{t.ui.registry.addToggleButton("ltr",{tooltip:"Left to right",icon:"ltr",onAction:()=>t.execCommand("mceDirectionLTR"),onSetup:C(t,"ltr")}),t.ui.registry.addToggleButton("rtl",{tooltip:"Right to left",icon:"rtl",onAction:()=>t.execCommand("mceDirectionRTL"),onSetup:C(t,"rtl")})})(t)}))}(); \ No newline at end of file +!function(){"use strict";var t=tinymce.util.Tools.resolve("tinymce.PluginManager");const e=t=>e=>typeof e===t,r=t=>"string"===(t=>{const e=typeof t;return null===t?"null":"object"===e&&Array.isArray(t)?"array":"object"===e&&(r=o=t,(n=String).prototype.isPrototypeOf(r)||o.constructor?.name===n.name)?"string":e;var r,o,n})(t),o=e("boolean"),n=t=>!(t=>null==t)(t),i=e("function"),s=e("number"),l=(t,e)=>t===e,a=()=>false;class c{tag;value;static singletonNone=new c(!1);constructor(t,e){this.tag=t,this.value=e}static some(t){return new c(!0,t)}static none(){return c.singletonNone}fold(t,e){return this.tag?e(this.value):t()}isSome(){return this.tag}isNone(){return!this.tag}map(t){return this.tag?c.some(t(this.value)):c.none()}bind(t){return this.tag?t(this.value):c.none()}exists(t){return this.tag&&t(this.value)}forall(t){return!this.tag||t(this.value)}filter(t){return!this.tag||t(this.value)?this:c.none()}getOr(t){return this.tag?this.value:t}or(t){return this.tag?this:t}getOrThunk(t){return this.tag?this.value:t()}orThunk(t){return this.tag?this:t()}getOrDie(t){if(this.tag)return this.value;throw new Error(t??"Called getOrDie on None")}static from(t){return n(t)?c.some(t):c.none()}getOrNull(){return this.tag?this.value:null}getOrUndefined(){return this.value}each(t){this.tag&&t(this.value)}toArray(){return this.tag?[this.value]:[]}toString(){return this.tag?`some(${this.value})`:"none()"}}Array.prototype.slice;const u=(t,e)=>{for(let r=0,o=t.length;rt.replace(m,""));var m;const h=t=>t.length>0,g=t=>{if(null==t)throw new Error("Node cannot be null or undefined");return{dom:t}},y=g,f=(t,e)=>{const r=t.dom;if(1!==r.nodeType)return!1;{const t=r;if(void 0!==t.matches)return t.matches(e);if(void 0!==t.msMatchesSelector)return t.msMatchesSelector(e);if(void 0!==t.webkitMatchesSelector)return t.webkitMatchesSelector(e);if(void 0!==t.mozMatchesSelector)return t.mozMatchesSelector(e);throw new Error("Browser lacks native selectors")}},v=t=>e=>(t=>t.dom.nodeType)(e)===t,p=v(1),w=v(3),b=v(11),S=t=>y(t.dom.host),A=(t,e)=>{const r=t.dom.getAttribute(e);return null===r?void 0:r},N=(t,e)=>{t.dom.removeAttribute(e)},T=t=>void 0!==t.style&&i(t.style.getPropertyValue),C=t=>{const e=w(t)?t.dom.parentNode:t.dom;if(null==e||null===e.ownerDocument)return!1;const r=e.ownerDocument;return(t=>{const e=(t=>y(t.dom.getRootNode()))(t);return b(r=e)&&n(r.dom.host)?c.some(e):c.none();var r})(y(e)).fold(()=>r.body.contains(e),(o=C,i=S,t=>o(i(t))));var o,i},k=t=>"rtl"===((t,e)=>{const r=t.dom,o=window.getComputedStyle(r).getPropertyValue(e);return""!==o||C(t)?o:((t,e)=>T(t)?t.style.getPropertyValue(e):"")(r,e)})(t,"direction")?"rtl":"ltr",D=(t,e)=>(t=>((t,e)=>{const r=[];for(let o=0,n=t.length;o{const r=t.length,o=new Array(r);for(let n=0;nf(t,e)))(t),x=t=>p(t)&&"li"===t.dom.nodeName.toLowerCase();const M=(t,e,n)=>{u(e,e=>{const m=y(e),g=x(m),v=((t,e)=>{return(e?(r=t,o="ol,ul",((t,e,r)=>{let o=t.dom;const n=i(r)?r:a;for(;o.parentNode;){o=o.parentNode;const t=y(o);if(e(t))return c.some(t);if(n(t))break}return c.none()})(r,t=>f(t,o),n)):c.some(t)).getOr(t);var r,o,n})(m,g),p=A(v,"dir"),w=c.from(t.getStyle(v.dom,"direction",!1)).filter(h);if(p===n||w.exists(t=>t===n)?(N(v,"dir"),S="direction",((t,e)=>{T(t)&&t.style.removeProperty(e)})((b=v).dom,S),((t,e,r=l)=>t.exists(t=>r(t,e)))((t=>c.from(A(t,"style")))(b).map(d),"")&&N(b,"style")):p!==n&&(((t,e,n)=>{((t,e,n)=>{if(!(r(n)||o(n)||s(n)))throw console.error("Invalid call to Attribute.set. Key ",e,":: Value ",n,":: Element ",t),new Error("Attribute value was not simple");t.setAttribute(e,n+"")})(t.dom,e,n)})(v,"dir",n),(w.exists(t=>t!==n)||k(v)!==n)&&t.setStyle(v.dom,"direction",n)),g){const e=D(v,"li[dir],li[style]");u(e,e=>{N(e,"dir"),t.setStyle(e.dom,"direction",null)})}var b,S})},O=(t,e)=>{t.selection.isEditable()&&(M(t.dom,t.selection.getSelectedBlocks(),e),t.nodeChanged())},P="directionality";t.add(P,t=>((t=>{t.addCommand("mceDirectionLTR",()=>{O(t,"ltr")}),t.addCommand("mceDirectionRTL",()=>{O(t,"rtl")})})(t),(t=>{const e=e=>r=>{const o=o=>{const n=t.dom.isBlock(o.element)?o.element:t.dom.getParent(o.element,t.dom.isBlock);if(n){const o=t.dom.getStyle(n,"direction")||t.dom.getAttrib(n,"dir");r.setActive(o===e)}};return t.on("NodeChange",o),()=>t.off("NodeChange",o)};t.ui.registry.addToggleButton("ltr",{tooltip:"Left to right",icon:"ltr",context:"editable",onAction:()=>t.execCommand("mceDirectionLTR"),onSetup:e("ltr")}),t.ui.registry.addToggleButton("rtl",{tooltip:"Right to left",icon:"rtl",context:"editable",onAction:()=>t.execCommand("mceDirectionRTL"),onSetup:e("rtl")})})(t),{getMetadata:()=>({name:"Directionality",type:"opensource",slug:P})}))}(); \ No newline at end of file diff --git a/public/assets/tinymce/plugins/emoticons/plugin.js b/public/assets/tinymce/plugins/emoticons/plugin.js index a3eaf1f1a..877ecf26f 100644 --- a/public/assets/tinymce/plugins/emoticons/plugin.js +++ b/public/assets/tinymce/plugins/emoticons/plugin.js @@ -1,5 +1,5 @@ /** - * TinyMCE version 8.1.2 (TBD) + * TinyMCE version 8.10.0 (2026-10-14) */ (function () { @@ -17,12 +17,6 @@ const isFunction = isSimpleType('function'); const noop = () => { }; - const constant = (value) => { - return () => { - return value; - }; - }; - const never = constant(false); /** * The `Optional` type represents a value (of any type) that potentially does @@ -40,6 +34,11 @@ * strict-null-checks */ class Optional { + tag; + value; + // Sneaky optimisation: every instance of Optional.none is identical, so just + // reuse the same object + static singletonNone = new Optional(false); // The internal representation has a `tag` and a `value`, but both are // private: able to be console.logged, but not able to be accessed by code constructor(tag, value) { @@ -207,7 +206,7 @@ */ getOrDie(message) { if (!this.tag) { - throw new Error(message !== null && message !== void 0 ? message : 'Called getOrDie on None'); + throw new Error(message ?? 'Called getOrDie on None'); } else { return this.value; @@ -271,9 +270,6 @@ return this.tag ? `some(${this.value})` : 'none()'; } } - // Sneaky optimisation: every instance of Optional.none is identical, so just - // reuse the same object - Optional.singletonNone = new Optional(false); const nativeSlice = Array.prototype.slice; const exists = (xs, pred) => { @@ -594,7 +590,6 @@ const emojisFrom = (list, pattern, maxResults) => { const matches = []; const lowerCasePattern = pattern.toLowerCase(); - const reachedLimit = maxResults.fold(() => never, (max) => (size) => size >= max); for (let i = 0; i < list.length; i++) { // TODO: more intelligent search by showing title matches at the top, keyword matches after that (use two arrays and concat at the end) if (pattern.length === 0 || emojiMatches(list[i], lowerCasePattern)) { @@ -603,7 +598,7 @@ text: list[i].title, icon: list[i].char }); - if (reachedLimit(matches.length)) { + if (maxResults.exists((max) => matches.length >= max)) { break; } } @@ -615,14 +610,14 @@ const open = (editor, database) => { const initialState = { pattern: '', - results: emojisFrom(database.listAll(), '', Optional.some(300)) + results: emojisFrom(database.listAll(), '', Optional.none()) }; const currentTab = Cell(ALL_CATEGORY); const scan = (dialogApi) => { const dialogData = dialogApi.getData(); const category = currentTab.get(); const candidates = database.listCategory(category); - const results = emojisFrom(candidates, dialogData[patternName], category === ALL_CATEGORY ? Optional.some(300) : Optional.none()); + const results = emojisFrom(candidates, dialogData[patternName], Optional.none()); dialogApi.setData({ results }); @@ -644,6 +639,7 @@ const getInitialState = () => { const body = { type: 'tabpanel', + dynamicHeight: true, // All tabs have the same fields. tabs: map$1(database.listCategories(), (cat) => ({ title: cat, @@ -781,8 +777,9 @@ * @class tinymce.emoticons.Plugin * @private */ + const PLUGIN_CODE = 'emoticons'; var Plugin = () => { - global$1.add('emoticons', (editor, pluginUrl) => { + global$1.add(PLUGIN_CODE, (editor, pluginUrl) => { register$2(editor, pluginUrl); const databaseUrl = getEmojiDatabaseUrl(editor); const databaseId = getEmojiDatabaseId(editor); @@ -792,7 +789,8 @@ init(editor, database); setup(editor); return { - getAllEmojis: () => database.waitForLoad().then(() => database.listAll()) + getAllEmojis: () => database.waitForLoad().then(() => database.listAll()), + getMetadata: () => ({ name: 'Emoticons', type: 'opensource', slug: PLUGIN_CODE }) }; }); }; diff --git a/public/assets/tinymce/plugins/emoticons/plugin.min.js b/public/assets/tinymce/plugins/emoticons/plugin.min.js index f9985ffab..dfe3cb3a3 100644 --- a/public/assets/tinymce/plugins/emoticons/plugin.min.js +++ b/public/assets/tinymce/plugins/emoticons/plugin.min.js @@ -1 +1 @@ -!function(){"use strict";var t=tinymce.util.Tools.resolve("tinymce.PluginManager");const e=t=>e=>t===e,o=e(null),n=e(void 0),r=t=>"function"==typeof t;const s=()=>{},a=()=>!1;class i{constructor(t,e){this.tag=t,this.value=e}static some(t){return new i(!0,t)}static none(){return i.singletonNone}fold(t,e){return this.tag?e(this.value):t()}isSome(){return this.tag}isNone(){return!this.tag}map(t){return this.tag?i.some(t(this.value)):i.none()}bind(t){return this.tag?t(this.value):i.none()}exists(t){return this.tag&&t(this.value)}forall(t){return!this.tag||t(this.value)}filter(t){return!this.tag||t(this.value)?this:i.none()}getOr(t){return this.tag?this.value:t}or(t){return this.tag?this:t}getOrThunk(t){return this.tag?this.value:t()}orThunk(t){return this.tag?this:t()}getOrDie(t){if(this.tag)return this.value;throw new Error(null!=t?t:"Called getOrDie on None")}static from(t){return null==t?i.none():i.some(t)}getOrNull(){return this.tag?this.value:null}getOrUndefined(){return this.value}each(t){this.tag&&t(this.value)}toArray(){return this.tag?[this.value]:[]}toString(){return this.tag?`some(${this.value})`:"none()"}}i.singletonNone=new i(!1),Array.prototype.slice;const l=(t,e)=>{const o=t.length,n=new Array(o);for(let r=0;r{const o=c(t);for(let n=0,r=o.length;nu.call(t,e),d=t=>{let e=t;return{get:()=>e,set:t=>{e=t}}},h=(p=(t,e)=>e,(...t)=>{if(0===t.length)throw new Error("Can't merge zero objects");const e={};for(let o=0;o{const t=(t=>{const e=d(i.none()),o=()=>e.get().each(t);return{clear:()=>{o(),e.set(i.none())},isSet:()=>e.get().isSome(),get:()=>e.get(),set:t=>{o(),e.set(i.some(t))}}})(s);return{...t,on:e=>t.get().each(e)}},f=(t,e,o=0,r)=>{const s=t.indexOf(e,o);return-1!==s&&(!!n(r)||s+e.length<=r)};var v=tinymce.util.Tools.resolve("tinymce.Resource");const b=t=>e=>e.options.get(t),w=b("emoticons_database"),j=b("emoticons_database_url"),C=b("emoticons_database_id"),_=b("emoticons_append"),A=b("emoticons_images_url"),k="All",O={symbols:"Symbols",people:"People",animals_and_nature:"Animals and Nature",food_and_drink:"Food and Drink",activity:"Activity",travel_and_places:"Travel and Places",objects:"Objects",flags:"Flags",user:"User Defined"},x=(t,e)=>m(t,e)?t[e]:e,E=t=>{const e=_(t);return o=t=>({keywords:[],category:"user",...t}),((t,e)=>{const o={};return g(t,((t,n)=>{const r=e(t,n);o[r.k]=r.v})),o})(e,((t,e)=>({k:e,v:o(t)})));var o},L=(t,e)=>f(t.title.toLowerCase(),e)||(t=>{for(let n=0,r=t.length;n{const n=[],r=e.toLowerCase(),s=o.fold((()=>a),(t=>e=>e>=t));for(let o=0;o{const n={pattern:"",results:S(e.listAll(),"",i.some(300))},r=d(k),s=(t=>{let e=null;const n=()=>{o(e)||(clearTimeout(e),e=null)};return{cancel:n,throttle:(...o)=>{n(),e=setTimeout((()=>{e=null,t.apply(null,o)}),200)}}})((t=>{(t=>{const o=t.getData(),n=r.get(),s=e.listCategory(n),a=S(s,o[N],n===k?i.some(300):i.none());t.setData({results:a})})(t)})),a={label:"Search",type:"input",name:N},c={type:"collection",name:"results"},u=()=>({title:"Emojis",size:"normal",body:{type:"tabpanel",tabs:l(e.listCategories(),(t=>({title:t,name:t,items:[a,c]})))},initialData:n,onTabChange:(t,e)=>{r.set(e.newTabName),s.throttle(t)},onChange:s.throttle,onAction:(e,o)=>{"results"===o.name&&(((t,e)=>{t.insertContent(e)})(t,o.value),e.close())},buttons:[{type:"cancel",text:"Close",primary:!0}]}),g=t.windowManager.open(u());g.focus(N),e.hasLoaded()||(g.block("Loading emojis..."),e.waitForLoad().then((()=>{g.redial(u()),s.throttle(g),g.focus(N),g.unblock()})).catch((t=>{g.redial({title:"Emojis",body:{type:"panel",items:[{type:"alertbanner",level:"error",icon:"warning",text:"Could not load emojis"}]},buttons:[{type:"cancel",text:"Close",primary:!0}],initialData:{pattern:"",results:[]}}),g.focus(N),g.unblock()})))},D=t=>e=>{const o=()=>{e.setEnabled(t.selection.isEditable())};return t.on("NodeChange",o),o(),()=>{t.off("NodeChange",o)}};t.add("emoticons",((t,e)=>{((t,e)=>{const o=t.options.register;o("emoticons_database",{processor:"string",default:"emojis"}),o("emoticons_database_url",{processor:"string",default:`${e}/js/${w(t)}${t.suffix}.js`}),o("emoticons_database_id",{processor:"string",default:"tinymce.plugins.emoticons"}),o("emoticons_append",{processor:"object",default:{}}),o("emoticons_images_url",{processor:"string",default:"https://cdnjs.cloudflare.com/ajax/libs/twemoji/15.1.0/72x72/"})})(t,e);const o=((t,e,o)=>{const n=y(),r=y(),s=A(t),a=t=>{return o="=4&&e.substr(0,4)===o?t.char.replace(/src="([^"]+)"/,((t,e)=>`src="${s}${e}"`)):t.char;var e,o};t.on("init",(()=>{v.load(o,e).then((e=>{const o=E(t);(t=>{const e={},o=[];g(t,((t,n)=>{const r={title:n,keywords:t.keywords,char:a(t),category:x(O,t.category)},s=void 0!==e[r.category]?e[r.category]:[];e[r.category]=s.concat([r]),o.push(r)})),n.set(e),r.set(o)})(h(e,o))}),(t=>{console.log(`Failed to load emojis: ${t}`),n.set({}),r.set([])}))}));const l=()=>r.get().getOr([]),u=()=>n.isSet()&&r.isSet();return{listCategories:()=>[k].concat(c(n.get().getOr({}))),hasLoaded:u,waitForLoad:()=>u()?Promise.resolve(!0):new Promise(((t,o)=>{let n=15;const r=setInterval((()=>{u()?(clearInterval(r),t(!0)):(n--,n<0&&(console.log("Could not load emojis from url: "+e),clearInterval(r),o(!1)))}),100)})),listAll:l,listCategory:t=>t===k?l():n.get().bind((e=>i.from(e[t]))).getOr([])}})(t,j(t),C(t));return((t,e)=>{t.addCommand("mceEmoticons",(()=>T(t,e)))})(t,o),(t=>{const e=()=>t.execCommand("mceEmoticons");t.ui.registry.addButton("emoticons",{tooltip:"Emojis",icon:"emoji",onAction:e,onSetup:D(t)}),t.ui.registry.addMenuItem("emoticons",{text:"Emojis...",icon:"emoji",onAction:e,onSetup:D(t)})})(t),((t,e)=>{t.ui.registry.addAutocompleter("emoticons",{trigger:":",columns:"auto",minChars:2,fetch:(t,o)=>e.waitForLoad().then((()=>{const n=e.listAll();return S(n,t,i.some(o))})),onAction:(e,o,n)=>{t.selection.setRng(o),t.insertContent(n),e.hide()}})})(t,o),(t=>{t.on("PreInit",(()=>{t.parser.addAttributeFilter("data-emoticon",(t=>{(t=>{for(let o=0,n=t.length;oo.waitForLoad().then((()=>o.listAll()))}}))}(); \ No newline at end of file +!function(){"use strict";var t=tinymce.util.Tools.resolve("tinymce.PluginManager");const e=t=>e=>t===e,o=e(null),n=e(void 0),s=t=>"function"==typeof t;const r=()=>{};class a{tag;value;static singletonNone=new a(!1);constructor(t,e){this.tag=t,this.value=e}static some(t){return new a(!0,t)}static none(){return a.singletonNone}fold(t,e){return this.tag?e(this.value):t()}isSome(){return this.tag}isNone(){return!this.tag}map(t){return this.tag?a.some(t(this.value)):a.none()}bind(t){return this.tag?t(this.value):a.none()}exists(t){return this.tag&&t(this.value)}forall(t){return!this.tag||t(this.value)}filter(t){return!this.tag||t(this.value)?this:a.none()}getOr(t){return this.tag?this.value:t}or(t){return this.tag?this:t}getOrThunk(t){return this.tag?this.value:t()}orThunk(t){return this.tag?this:t()}getOrDie(t){if(this.tag)return this.value;throw new Error(t??"Called getOrDie on None")}static from(t){return null==t?a.none():a.some(t)}getOrNull(){return this.tag?this.value:null}getOrUndefined(){return this.value}each(t){this.tag&&t(this.value)}toArray(){return this.tag?[this.value]:[]}toString(){return this.tag?`some(${this.value})`:"none()"}}Array.prototype.slice;const i=(t,e)=>{const o=t.length,n=new Array(o);for(let s=0;s{const o=l(t);for(let n=0,s=o.length;nc.call(t,e),m=t=>{let e=t;return{get:()=>e,set:t=>{e=t}}},d=(h=(t,e)=>e,(...t)=>{if(0===t.length)throw new Error("Can't merge zero objects");const e={};for(let o=0;o{const t=(t=>{const e=m(a.none()),o=()=>e.get().each(t);return{clear:()=>{o(),e.set(a.none())},isSet:()=>e.get().isSome(),get:()=>e.get(),set:t=>{o(),e.set(a.some(t))}}})(r);return{...t,on:e=>t.get().each(e)}},y=(t,e,o=0,s)=>{const r=t.indexOf(e,o);return-1!==r&&(!!n(s)||r+e.length<=s)};var f=tinymce.util.Tools.resolve("tinymce.Resource");const v=t=>e=>e.options.get(t),b=v("emoticons_database"),w=v("emoticons_database_url"),j=v("emoticons_database_id"),C=v("emoticons_append"),_=v("emoticons_images_url"),A="All",k={symbols:"Symbols",people:"People",animals_and_nature:"Animals and Nature",food_and_drink:"Food and Drink",activity:"Activity",travel_and_places:"Travel and Places",objects:"Objects",flags:"Flags",user:"User Defined"},O=(t,e)=>g(t,e)?t[e]:e,x=t=>{const e=C(t);return o=t=>({keywords:[],category:"user",...t}),((t,e)=>{const o={};return u(t,(t,n)=>{const s=e(t,n);o[s.k]=s.v}),o})(e,(t,e)=>({k:e,v:o(t)}));var o},E=(t,e)=>y(t.title.toLowerCase(),e)||((t,e)=>{for(let o=0,n=t.length;oy(t.toLowerCase(),e)),L=(t,e,o)=>{const n=[],s=e.toLowerCase();for(let r=0;rn.length>=t)));r++);return n},S="pattern",N=(t,e)=>{const n={pattern:"",results:L(e.listAll(),"",a.none())},s=m(A),r=(t=>{let e=null;const n=()=>{o(e)||(clearTimeout(e),e=null)};return{cancel:n,throttle:(...o)=>{n(),e=setTimeout(()=>{e=null,t.apply(null,o)},200)}}})(t=>{(t=>{const o=t.getData(),n=s.get(),r=e.listCategory(n),i=L(r,o[S],a.none());t.setData({results:i})})(t)}),l={label:"Search",type:"input",name:S},c={type:"collection",name:"results"},u=()=>({title:"Emojis",size:"normal",body:{type:"tabpanel",dynamicHeight:!0,tabs:i(e.listCategories(),t=>({title:t,name:t,items:[l,c]}))},initialData:n,onTabChange:(t,e)=>{s.set(e.newTabName),r.throttle(t)},onChange:r.throttle,onAction:(e,o)=>{"results"===o.name&&(((t,e)=>{t.insertContent(e)})(t,o.value),e.close())},buttons:[{type:"cancel",text:"Close",primary:!0}]}),g=t.windowManager.open(u());g.focus(S),e.hasLoaded()||(g.block("Loading emojis..."),e.waitForLoad().then(()=>{g.redial(u()),r.throttle(g),g.focus(S),g.unblock()}).catch(t=>{g.redial({title:"Emojis",body:{type:"panel",items:[{type:"alertbanner",level:"error",icon:"warning",text:"Could not load emojis"}]},buttons:[{type:"cancel",text:"Close",primary:!0}],initialData:{pattern:"",results:[]}}),g.focus(S),g.unblock()}))},T=t=>e=>{const o=()=>{e.setEnabled(t.selection.isEditable())};return t.on("NodeChange",o),o(),()=>{t.off("NodeChange",o)}},D="emoticons";t.add(D,(t,e)=>{((t,e)=>{const o=t.options.register;o("emoticons_database",{processor:"string",default:"emojis"}),o("emoticons_database_url",{processor:"string",default:`${e}/js/${b(t)}${t.suffix}.js`}),o("emoticons_database_id",{processor:"string",default:"tinymce.plugins.emoticons"}),o("emoticons_append",{processor:"object",default:{}}),o("emoticons_images_url",{processor:"string",default:"https://cdnjs.cloudflare.com/ajax/libs/twemoji/15.1.0/72x72/"})})(t,e);const o=((t,e,o)=>{const n=p(),s=p(),r=_(t),i=t=>{return o="=4&&e.substr(0,4)===o?t.char.replace(/src="([^"]+)"/,(t,e)=>`src="${r}${e}"`):t.char;var e,o};t.on("init",()=>{f.load(o,e).then(e=>{const o=x(t);(t=>{const e={},o=[];u(t,(t,n)=>{const s={title:n,keywords:t.keywords,char:i(t),category:O(k,t.category)},r=void 0!==e[s.category]?e[s.category]:[];e[s.category]=r.concat([s]),o.push(s)}),n.set(e),s.set(o)})(d(e,o))},t=>{console.log(`Failed to load emojis: ${t}`),n.set({}),s.set([])})});const c=()=>s.get().getOr([]),g=()=>n.isSet()&&s.isSet();return{listCategories:()=>[A].concat(l(n.get().getOr({}))),hasLoaded:g,waitForLoad:()=>g()?Promise.resolve(!0):new Promise((t,o)=>{let n=15;const s=setInterval(()=>{g()?(clearInterval(s),t(!0)):(n--,n<0&&(console.log("Could not load emojis from url: "+e),clearInterval(s),o(!1)))},100)}),listAll:c,listCategory:t=>t===A?c():n.get().bind(e=>a.from(e[t])).getOr([])}})(t,w(t),j(t));return((t,e)=>{t.addCommand("mceEmoticons",()=>N(t,e))})(t,o),(t=>{const e=()=>t.execCommand("mceEmoticons");t.ui.registry.addButton("emoticons",{tooltip:"Emojis",icon:"emoji",onAction:e,onSetup:T(t)}),t.ui.registry.addMenuItem("emoticons",{text:"Emojis...",icon:"emoji",onAction:e,onSetup:T(t)})})(t),((t,e)=>{t.ui.registry.addAutocompleter("emoticons",{trigger:":",columns:"auto",minChars:2,fetch:(t,o)=>e.waitForLoad().then(()=>{const n=e.listAll();return L(n,t,a.some(o))}),onAction:(e,o,n)=>{t.selection.setRng(o),t.insertContent(n),e.hide()}})})(t,o),(t=>{t.on("PreInit",()=>{t.parser.addAttributeFilter("data-emoticon",t=>{((t,e)=>{for(let o=0,n=t.length;o{t.attr("data-mce-resize","false"),t.attr("data-mce-placeholder","1")})})})})(t),{getAllEmojis:()=>o.waitForLoad().then(()=>o.listAll()),getMetadata:()=>({name:"Emoticons",type:"opensource",slug:D})}})}(); \ No newline at end of file diff --git a/public/assets/tinymce/plugins/fullscreen/plugin.js b/public/assets/tinymce/plugins/fullscreen/plugin.js index 64572c7ef..a71c80f76 100644 --- a/public/assets/tinymce/plugins/fullscreen/plugin.js +++ b/public/assets/tinymce/plugins/fullscreen/plugin.js @@ -1,5 +1,5 @@ /** - * TinyMCE version 8.1.2 (TBD) + * TinyMCE version 8.10.0 (2026-10-14) */ (function () { @@ -7,13 +7,12 @@ /* eslint-disable @typescript-eslint/no-wrapper-object-types */ const hasProto = (v, constructor, predicate) => { - var _a; if (predicate(v, constructor.prototype)) { return true; } else { // String-based fallback time - return ((_a = v.constructor) === null || _a === void 0 ? void 0 : _a.name) === constructor.name; + return v.constructor?.name === constructor.name; } }; const typeOf = (x) => { @@ -84,6 +83,11 @@ * strict-null-checks */ class Optional { + tag; + value; + // Sneaky optimisation: every instance of Optional.none is identical, so just + // reuse the same object + static singletonNone = new Optional(false); // The internal representation has a `tag` and a `value`, but both are // private: able to be console.logged, but not able to be accessed by code constructor(tag, value) { @@ -251,7 +255,7 @@ */ getOrDie(message) { if (!this.tag) { - throw new Error(message !== null && message !== void 0 ? message : 'Called getOrDie on None'); + throw new Error(message ?? 'Called getOrDie on None'); } else { return this.value; @@ -315,9 +319,6 @@ return this.tag ? `some(${this.value})` : 'none()'; } } - // Sneaky optimisation: every instance of Optional.none is identical, so just - // reuse the same object - Optional.singletonNone = new Optional(false); const nativePush = Array.prototype.push; const map = (xs, f) => { @@ -676,7 +677,7 @@ const detectBrowser$1 = (browsers, userAgentData) => { return findMap(userAgentData.brands, (uaBrand) => { const lcBrand = uaBrand.brand.toLowerCase(); - return find$1(browsers, (browser) => { var _a; return lcBrand === ((_a = browser.brand) === null || _a === void 0 ? void 0 : _a.toLowerCase()); }) + return find$1(browsers, (browser) => lcBrand === browser.brand?.toLowerCase()) .map((info) => ({ current: info.name, version: Version.nu(parseInt(uaBrand.version, 10), 0) @@ -1458,7 +1459,7 @@ const isTouch = global$1.deviceType.isTouch(); const editorContainerStyle = editorContainer.style; const iframe = editor.iframeElement; - const iframeStyle = iframe === null || iframe === void 0 ? void 0 : iframe.style; + const iframeStyle = iframe?.style; const handleClasses = (handler) => { handler(body, 'tox-fullscreen'); handler(documentElement, 'tox-fullscreen'); @@ -1581,18 +1582,25 @@ }); }; + const PLUGIN_CODE = 'fullscreen'; var Plugin = () => { - global$3.add('fullscreen', (editor) => { + global$3.add(PLUGIN_CODE, (editor) => { const fullscreenState = Cell(null); if (editor.inline) { - return get$4(fullscreenState); + return { + ...get$4(fullscreenState), + getMetadata: () => ({ name: 'Full Screen', type: 'opensource', slug: PLUGIN_CODE }) + }; } register$2(editor); register$1(editor, fullscreenState); register(editor, fullscreenState); setup(editor, fullscreenState); editor.addShortcut('Meta+Shift+F', '', 'mceFullScreen'); - return get$4(fullscreenState); + return { + ...get$4(fullscreenState), + getMetadata: () => ({ name: 'Full Screen', type: 'opensource', slug: PLUGIN_CODE }) + }; }); }; diff --git a/public/assets/tinymce/plugins/fullscreen/plugin.min.js b/public/assets/tinymce/plugins/fullscreen/plugin.min.js index 1c8aa690c..074610bf4 100644 --- a/public/assets/tinymce/plugins/fullscreen/plugin.min.js +++ b/public/assets/tinymce/plugins/fullscreen/plugin.min.js @@ -1 +1 @@ -!function(){"use strict";const e=e=>t=>(e=>{const t=typeof e;return null===e?"null":"object"===t&&Array.isArray(e)?"array":"object"===t&&(n=r=e,(o=String).prototype.isPrototypeOf(n)||(null===(s=r.constructor)||void 0===s?void 0:s.name)===o.name)?"string":t;var n,r,o,s})(t)===e,t=e=>t=>typeof t===e,n=e=>t=>e===t,r=e("string"),o=e("object"),s=e("array"),i=n(null),l=t("boolean"),a=n(void 0),c=e=>!(e=>null==e)(e),u=t("function"),d=t("number"),m=()=>{},h=e=>()=>e;function g(e,...t){return(...n)=>{const r=t.concat(n);return e.apply(null,r)}}const p=h(!1),f=h(!0);class v{constructor(e,t){this.tag=e,this.value=t}static some(e){return new v(!0,e)}static none(){return v.singletonNone}fold(e,t){return this.tag?t(this.value):e()}isSome(){return this.tag}isNone(){return!this.tag}map(e){return this.tag?v.some(e(this.value)):v.none()}bind(e){return this.tag?e(this.value):v.none()}exists(e){return this.tag&&e(this.value)}forall(e){return!this.tag||e(this.value)}filter(e){return!this.tag||e(this.value)?this:v.none()}getOr(e){return this.tag?this.value:e}or(e){return this.tag?this:e}getOrThunk(e){return this.tag?this.value:e()}orThunk(e){return this.tag?this:e()}getOrDie(e){if(this.tag)return this.value;throw new Error(null!=e?e:"Called getOrDie on None")}static from(e){return c(e)?v.some(e):v.none()}getOrNull(){return this.tag?this.value:null}getOrUndefined(){return this.value}each(e){this.tag&&e(this.value)}toArray(){return this.tag?[this.value]:[]}toString(){return this.tag?`some(${this.value})`:"none()"}}v.singletonNone=new v(!1);const w=Array.prototype.push,y=(e,t)=>{const n=e.length,r=new Array(n);for(let o=0;o{for(let n=0,r=e.length;n{const n=[];for(let r=0,o=e.length;r((e,t,n)=>{for(let r=0,o=e.length;r{let t=e;return{get:()=>t,set:e=>{t=e}}},O="undefined"!=typeof window?window:Function("return this;")(),k=(e,t)=>((e,t)=>{let n=null!=t?t:O;for(let t=0;t{const t=F(v.none()),n=()=>t.get().each(e);return{clear:()=>{n(),t.set(v.none())},isSet:()=>t.get().isSome(),get:()=>t.get(),set:e=>{n(),t.set(v.some(e))}}},C=()=>T((e=>e.unbind())),A=(e,t,n=0,r)=>{const o=e.indexOf(t,n);return-1!==o&&(!!a(r)||o+t.length<=r)};var R=tinymce.util.Tools.resolve("tinymce.PluginManager");const L=e=>{if(null==e)throw new Error("Node cannot be null or undefined");return{dom:e}},M=L,P=(e,t)=>{const n=e.dom;if(1!==n.nodeType)return!1;{const e=n;if(void 0!==e.matches)return e.matches(t);if(void 0!==e.msMatchesSelector)return e.msMatchesSelector(t);if(void 0!==e.webkitMatchesSelector)return e.webkitMatchesSelector(t);if(void 0!==e.mozMatchesSelector)return e.mozMatchesSelector(t);throw new Error("Browser lacks native selectors")}},D=()=>N(0,0),N=(e,t)=>({major:e,minor:t}),H={nu:N,detect:(e,t)=>{const n=String(t).toLowerCase();return 0===e.length?D():((e,t)=>{const n=((e,t)=>{for(let n=0;nNumber(t.replace(n,"$"+e));return N(r(1),r(2))})(e,n)},unknown:D},V=(e,t)=>{const n=String(t).toLowerCase();return x(e,(e=>e.search(n)))},W=/.*?version\/\ ?([0-9]+)\.([0-9]+).*/,q=e=>t=>A(t,e),B=[{name:"Edge",versionRegexes:[/.*?edge\/ ?([0-9]+)\.([0-9]+)$/],search:e=>A(e,"edge/")&&A(e,"chrome")&&A(e,"safari")&&A(e,"applewebkit")},{name:"Chromium",brand:"Chromium",versionRegexes:[/.*?chrome\/([0-9]+)\.([0-9]+).*/,W],search:e=>A(e,"chrome")&&!A(e,"chromeframe")},{name:"IE",versionRegexes:[/.*?msie\ ?([0-9]+)\.([0-9]+).*/,/.*?rv:([0-9]+)\.([0-9]+).*/],search:e=>A(e,"msie")||A(e,"trident")},{name:"Opera",versionRegexes:[W,/.*?opera\/([0-9]+)\.([0-9]+).*/],search:q("opera")},{name:"Firefox",versionRegexes:[/.*?firefox\/\ ?([0-9]+)\.([0-9]+).*/],search:q("firefox")},{name:"Safari",versionRegexes:[W,/.*?cpu os ([0-9]+)_([0-9]+).*/],search:e=>(A(e,"safari")||A(e,"mobile/"))&&A(e,"applewebkit")}],I=[{name:"Windows",search:q("win"),versionRegexes:[/.*?windows\ nt\ ?([0-9]+)\.([0-9]+).*/]},{name:"iOS",search:e=>A(e,"iphone")||A(e,"ipad"),versionRegexes:[/.*?version\/\ ?([0-9]+)\.([0-9]+).*/,/.*cpu os ([0-9]+)_([0-9]+).*/,/.*cpu iphone os ([0-9]+)_([0-9]+).*/]},{name:"Android",search:q("android"),versionRegexes:[/.*?android\ ?([0-9]+)\.([0-9]+).*/]},{name:"macOS",search:q("mac os x"),versionRegexes:[/.*?mac\ os\ x\ ?([0-9]+)_([0-9]+).*/]},{name:"Linux",search:q("linux"),versionRegexes:[]},{name:"Solaris",search:q("sunos"),versionRegexes:[]},{name:"FreeBSD",search:q("freebsd"),versionRegexes:[]},{name:"ChromeOS",search:q("cros"),versionRegexes:[/.*?chrome\/([0-9]+)\.([0-9]+).*/]}],j={browsers:h(B),oses:h(I)},_="Edge",z="Chromium",K="Opera",$="Firefox",U="Safari",X=e=>{const t=e.current,n=e.version,r=e=>()=>t===e;return{current:t,version:n,isEdge:r(_),isChromium:r(z),isIE:r("IE"),isOpera:r(K),isFirefox:r($),isSafari:r(U)}},Y=()=>X({current:void 0,version:H.unknown()}),G=X,J=(h(_),h(z),h("IE"),h(K),h($),h(U),"Windows"),Q="Android",Z="Linux",ee="macOS",te="Solaris",ne="FreeBSD",re="ChromeOS",oe=e=>{const t=e.current,n=e.version,r=e=>()=>t===e;return{current:t,version:n,isWindows:r(J),isiOS:r("iOS"),isAndroid:r(Q),isMacOS:r(ee),isLinux:r(Z),isSolaris:r(te),isFreeBSD:r(ne),isChromeOS:r(re)}},se=()=>oe({current:void 0,version:H.unknown()}),ie=oe,le=(h(J),h("iOS"),h(Q),h(Z),h(ee),h(te),h(ne),h(re),(e,t,n)=>{const r=j.browsers(),o=j.oses(),s=t.bind((e=>((e,t)=>((e,t)=>{for(let n=0;n{const n=t.brand.toLowerCase();return x(e,(e=>{var t;return n===(null===(t=e.brand)||void 0===t?void 0:t.toLowerCase())})).map((e=>({current:e.name,version:H.nu(parseInt(t.version,10),0)})))})))(r,e))).orThunk((()=>((e,t)=>V(e,t).map((e=>{const n=H.detect(e.versionRegexes,t);return{current:e.name,version:n}})))(r,e))).fold(Y,G),i=((e,t)=>V(e,t).map((e=>{const n=H.detect(e.versionRegexes,t);return{current:e.name,version:n}})))(o,e).fold(se,ie),l=((e,t,n,r)=>{const o=e.isiOS()&&!0===/ipad/i.test(n),s=e.isiOS()&&!o,i=e.isiOS()||e.isAndroid(),l=i||r("(pointer:coarse)"),a=o||!s&&i&&r("(min-device-width:768px)"),c=s||i&&!a,u=t.isSafari()&&e.isiOS()&&!1===/safari/i.test(n),d=!c&&!a&&!u;return{isiPad:h(o),isiPhone:h(s),isTablet:h(a),isPhone:h(c),isTouch:h(l),isAndroid:e.isAndroid,isiOS:e.isiOS,isWebView:h(u),isDesktop:h(d)}})(i,s,e,n);return{browser:s,os:i,deviceType:l}}),ae=e=>window.matchMedia(e).matches;let ce=(e=>{let t,n=!1;return(...r)=>(n||(n=!0,t=e.apply(null,r)),t)})((()=>le(window.navigator.userAgent,v.from(window.navigator.userAgentData),ae)));const ue=Object.getPrototypeOf,de=e=>{const t=k("ownerDocument.defaultView",e);return o(e)&&((e=>((e,t)=>{const n=((e,t)=>k(e,t))(e,t);if(null==n)throw new Error(e+" not available on this browser");return n})("HTMLElement",e))(t).prototype.isPrototypeOf(e)||/^HTML\w*Element$/.test(ue(e).constructor.name))},me=e=>t=>(e=>e.dom.nodeType)(t)===e,he=me(1),ge=me(3),pe=me(11),fe=e=>M(e.dom.ownerDocument),ve=e=>y(e.dom.childNodes,M),we=e=>{const t=(e=>M(e.dom.getRootNode()))(e);return pe(n=t)&&c(n.dom.host)?v.some(t):v.none();var n},ye=e=>M(e.dom.host),be=e=>{const t=M((e=>{if(c(e.target)){const t=M(e.target);if(he(t)&&c(t.dom.shadowRoot)&&e.composed&&e.composedPath){const t=e.composedPath();if(t)return(e=>0e.stopPropagation(),r=()=>e.preventDefault(),o=(s=r,i=n,(...e)=>s(i.apply(null,e)));var s,i;return((e,t,n,r,o,s,i)=>({target:e,x:t,y:n,stop:r,prevent:o,kill:s,raw:i}))(t,e.clientX,e.clientY,n,r,o,e)},Se=(e,t,n,r)=>{e.dom.removeEventListener(t,n,r)},xe=f,Ee=(e,t,n)=>((e,t,n,r)=>((e,t,n,r,o)=>{const s=((e,t)=>n=>{e(n)&&t(be(n))})(n,r);return e.dom.addEventListener(t,s,o),{unbind:g(Se,e,t,s,o)}})(e,t,n,r,!1))(e,t,xe,n),Fe=(e,t)=>{const n=e.dom.getAttribute(t);return null===n?void 0:n},Oe=(e,t)=>{e.dom.removeAttribute(t)},ke=e=>void 0!==e.style&&u(e.style.getPropertyValue),Te=e=>{const t=ge(e)?e.dom.parentNode:e.dom;if(null==t||null===t.ownerDocument)return!1;const n=t.ownerDocument;return we(M(t)).fold((()=>n.body.contains(t)),(r=Te,o=ye,e=>r(o(e))));var r,o},Ce=(e,t,n)=>{if(!r(n))throw console.error("Invalid call to CSS.set. Property ",t,":: Value ",n,":: Element ",e),new Error("CSS value must be a string: "+n);ke(e)&&e.style.setProperty(t,n)},Ae=(e,t,n)=>{const r=e.dom;Ce(r,t,n)},Re=(e,t)=>{const n=e.dom;((e,t)=>{const n=E(e);for(let r=0,o=n.length;r{Ce(n,t,e)}))},Le=(e,t)=>{const n=e.dom,r=window.getComputedStyle(n).getPropertyValue(t);return""!==r||Te(e)?r:Me(n,t)},Me=(e,t)=>ke(e)?e.style.getPropertyValue(t):"",Pe=(e,t)=>({left:e,top:t,translate:(n,r)=>Pe(e+n,t+r)}),De=Pe,Ne=(e,t,n)=>((e,t,n)=>S(((e,t)=>{const n=u(t)?t:p;let r=e.dom;const o=[];for(;null!==r.parentNode&&void 0!==r.parentNode;){const e=r.parentNode,t=M(e);if(o.push(t),!0===n(t))break;r=e}return o})(e,n),t))(e,(e=>P(e,t)),n),He=(e,t)=>(e=>{return S((e=>v.from(e.dom.parentNode).map(M))(n=e).map(ve).map((e=>S(e,(e=>{return t=e,!(n.dom===t.dom);var t})))).getOr([]),(e=>P(e,t)));var n})(e),Ve=e=>{const t=void 0===e?window:e;return ce().browser.isFirefox()?v.none():v.from(t.visualViewport)},We=(e,t,n,r)=>({x:e,y:t,width:n,height:r,right:e+n,bottom:t+r}),qe=e=>{const t=void 0===e?window:e,n=t.document,r=(e=>{const t=void 0!==e?e.dom:document,n=t.body.scrollLeft||t.documentElement.scrollLeft,r=t.body.scrollTop||t.documentElement.scrollTop;return De(n,r)})(M(n));return Ve(t).fold((()=>{const e=t.document.documentElement,n=e.clientWidth,o=e.clientHeight;return We(r.left,r.top,n,o)}),(e=>We(Math.max(e.pageLeft,r.left),Math.max(e.pageTop,r.top),e.width,e.height)))},Be=(e,t,n)=>Ve(n).map((n=>{const r=e=>t(be(e));return n.addEventListener(e,r),{unbind:()=>n.removeEventListener(e,r)}})).getOrThunk((()=>({unbind:m})));var Ie=tinymce.util.Tools.resolve("tinymce.dom.DOMUtils"),je=tinymce.util.Tools.resolve("tinymce.Env");const _e=(e,t)=>{e.dispatch("FullscreenStateChanged",{state:t}),e.dispatch("ResizeEditor")},ze=e=>e.options.get("fullscreen_native");const Ke=e=>{return e.dom===(void 0!==(t=fe(e).dom).fullscreenElement?t.fullscreenElement:void 0!==t.msFullscreenElement?t.msFullscreenElement:void 0!==t.webkitFullscreenElement?t.webkitFullscreenElement:null);var t},$e="data-ephox-mobile-fullscreen-style",Ue="position:absolute!important;",Xe="top:0!important;left:0!important;margin:0!important;padding:0!important;width:100%!important;height:100%!important;overflow:visible!important;",Ye=je.os.isAndroid(),Ge=(e,t,n)=>{const o=t=>n=>{const o=Fe(n,"style"),s=void 0===o?"no-styles":o.trim();s!==t&&(((e,t,n)=>{((e,t,n)=>{if(!(r(n)||l(n)||d(n)))throw console.error("Invalid call to Attribute.set. Key ",t,":: Value ",n,":: Element ",e),new Error("Attribute value was not simple");e.setAttribute(t,n+"")})(e.dom,t,n)})(n,$e,s),Re(n,e.parseStyle(t)))},i=Ne(t,"*"),a=(e=>{const t=[];for(let n=0,r=e.length;nHe(e,"*:not(.tox-silver-sink)")))),c=(e=>{const t=Le(e,"background-color");return void 0!==t&&""!==t?"background-color:"+t+"!important":"background-color:rgb(255,255,255)!important;"})(n);b(a,o("display:none!important;")),b(i,o(Ue+Xe+c)),o((!0===Ye?"":Ue)+Xe+c)(t)},Je=Ie.DOM,Qe=Ve().fold((()=>({bind:m,unbind:m})),(e=>{const t=(()=>{const e=T(m);return{...e,on:t=>e.get().each(t)}})(),n=C(),r=C(),o=(e=>{let t=null;return{cancel:()=>{i(t)||(clearTimeout(t),t=null)},throttle:(...n)=>{i(t)&&(t=setTimeout((()=>{t=null,e.apply(null,n)}),50))}}})((()=>{document.body.scrollTop=0,document.documentElement.scrollTop=0,window.requestAnimationFrame((()=>{t.on((t=>Re(t,{top:e.offsetTop+"px",left:e.offsetLeft+"px",height:e.height+"px",width:e.width+"px"})))}))}));return{bind:e=>{t.set(e),o.throttle(),n.set(Be("resize",o.throttle)),r.set(Be("scroll",o.throttle))},unbind:()=>{t.on((()=>{n.clear(),r.clear()})),t.clear()}}})),Ze=(e,t)=>{const n=document.body,r=document.documentElement,o=e.getContainer(),s=M(o),i=(l=s,v.from(l.dom.nextSibling).map(M)).filter((e=>(e=>he(e)&&de(e.dom))(e)&&(e=>(e=>void 0!==e.dom.classList)(e)&&e.dom.classList.contains("tox-silver-sink"))(e)));var l;const a=(e=>{const t=M(e.getElement());return we(t).map(ye).getOrThunk((()=>(e=>{const t=e.dom.body;if(null==t)throw new Error("Body is not available yet");return M(t)})(fe(t))))})(e),c=t.get(),u=M(e.getBody()),d=je.deviceType.isTouch(),m=o.style,h=e.iframeElement,g=null==h?void 0:h.style,p=e=>{e(n,"tox-fullscreen"),e(r,"tox-fullscreen"),e(o,"tox-fullscreen"),we(s).map((e=>ye(e).dom)).each((t=>{e(t,"tox-fullscreen"),e(t,"tox-shadowhost")}))},f=()=>{d&&(e=>{const t=(e=>{const t=document;return 1!==(n=t).nodeType&&9!==n.nodeType&&11!==n.nodeType||0===n.childElementCount?[]:y(t.querySelectorAll(e),M);var n})("["+$e+"]");b(t,(t=>{const n=Fe(t,$e);n&&"no-styles"!==n?Re(t,e.parseStyle(n)):Oe(t,"style"),Oe(t,$e)}))})(e.dom),p(Je.removeClass),Qe.unbind(),v.from(t.get()).each((e=>e.fullscreenChangeHandler.unbind()))};if(c)c.fullscreenChangeHandler.unbind(),ze(e)&&Ke(a)&&(e=>{const t=e.dom;t.exitFullscreen?t.exitFullscreen():t.msExitFullscreen?t.msExitFullscreen():t.webkitCancelFullScreen&&t.webkitCancelFullScreen()})(fe(a)),g.width=c.iframeWidth,g.height=c.iframeHeight,m.width=c.containerWidth,m.height=c.containerHeight,m.top=c.containerTop,m.left=c.containerLeft,S=i,x=c.sinkCssPosition,E=(e,t)=>{Ae(e,"position",t)},S.isSome()&&x.isSome()?v.some(E(S.getOrDie(),x.getOrDie())):v.none(),f(),w=c.scrollPos,window.scrollTo(w.x,w.y),t.set(null),_e(e,!1),e.off("remove",f);else{const n=Ee(fe(a),void 0!==document.fullscreenElement?"fullscreenchange":void 0!==document.msFullscreenElement?"MSFullscreenChange":void 0!==document.webkitFullscreenElement?"webkitfullscreenchange":"fullscreenchange",(n=>{ze(e)&&(Ke(a)||null===t.get()||Ze(e,t))})),r={scrollPos:qe(window),containerWidth:m.width,containerHeight:m.height,containerTop:m.top,containerLeft:m.left,iframeWidth:g.width,iframeHeight:g.height,fullscreenChangeHandler:n,sinkCssPosition:i.map((e=>Le(e,"position")))};d&&Ge(e.dom,s,u),g.width=g.height="100%",m.width=m.height="",p(Je.addClass),i.each((e=>{Ae(e,"position","fixed")})),Qe.bind(s),e.on("remove",f),t.set(r),ze(e)&&(e=>{const t=e.dom;t.requestFullscreen?t.requestFullscreen():t.msRequestFullscreen?t.msRequestFullscreen():t.webkitRequestFullScreen&&t.webkitRequestFullScreen()})(a),_e(e,!0)}var w,S,x,E};var et=tinymce.util.Tools.resolve("tinymce.util.VK");const tt=(e,t)=>n=>{n.setActive(null!==t.get());const r=e=>n.setActive(e.state);return e.on("FullscreenStateChanged",r),()=>e.off("FullscreenStateChanged",r)};R.add("fullscreen",(e=>{const t=F(null);return e.inline||((e=>{(0,e.options.register)("fullscreen_native",{processor:"boolean",default:!1})})(e),((e,t)=>{e.addCommand("mceFullScreen",(()=>{Ze(e,t)}))})(e,t),((e,t)=>{const n=()=>e.execCommand("mceFullScreen");e.ui.registry.addToggleMenuItem("fullscreen",{text:"Fullscreen",icon:"fullscreen",shortcut:"Meta+Shift+F",onAction:n,onSetup:tt(e,t),context:"any"}),e.ui.registry.addToggleButton("fullscreen",{tooltip:"Fullscreen",icon:"fullscreen",onAction:n,onSetup:tt(e,t),shortcut:"Meta+Shift+F",context:"any"})})(e,t),((e,t)=>{e.on("init",(()=>{e.on("keydown",(e=>{e.keyCode!==et.TAB||e.metaKey||e.ctrlKey||!t.get()||e.preventDefault()}))}))})(e,t),e.addShortcut("Meta+Shift+F","","mceFullScreen")),(e=>({isFullscreen:()=>null!==e.get()}))(t)}))}(); \ No newline at end of file +!function(){"use strict";const e=e=>t=>(e=>{const t=typeof e;return null===e?"null":"object"===t&&Array.isArray(e)?"array":"object"===t&&(n=r=e,(o=String).prototype.isPrototypeOf(n)||r.constructor?.name===o.name)?"string":t;var n,r,o})(t)===e,t=e=>t=>typeof t===e,n=e=>t=>e===t,r=e("string"),o=e("object"),s=e("array"),i=n(null),l=t("boolean"),a=n(void 0),c=e=>!(e=>null==e)(e),u=t("function"),d=t("number"),m=()=>{},h=e=>()=>e;function g(e,...t){return(...n)=>{const r=t.concat(n);return e.apply(null,r)}}const p=h(!1),f=h(!0);class v{tag;value;static singletonNone=new v(!1);constructor(e,t){this.tag=e,this.value=t}static some(e){return new v(!0,e)}static none(){return v.singletonNone}fold(e,t){return this.tag?t(this.value):e()}isSome(){return this.tag}isNone(){return!this.tag}map(e){return this.tag?v.some(e(this.value)):v.none()}bind(e){return this.tag?e(this.value):v.none()}exists(e){return this.tag&&e(this.value)}forall(e){return!this.tag||e(this.value)}filter(e){return!this.tag||e(this.value)?this:v.none()}getOr(e){return this.tag?this.value:e}or(e){return this.tag?this:e}getOrThunk(e){return this.tag?this.value:e()}orThunk(e){return this.tag?this:e()}getOrDie(e){if(this.tag)return this.value;throw new Error(e??"Called getOrDie on None")}static from(e){return c(e)?v.some(e):v.none()}getOrNull(){return this.tag?this.value:null}getOrUndefined(){return this.value}each(e){this.tag&&e(this.value)}toArray(){return this.tag?[this.value]:[]}toString(){return this.tag?`some(${this.value})`:"none()"}}const w=Array.prototype.push,y=(e,t)=>{const n=e.length,r=new Array(n);for(let o=0;o{for(let n=0,r=e.length;n{const n=[];for(let r=0,o=e.length;r((e,t,n)=>{for(let r=0,o=e.length;r{let t=e;return{get:()=>t,set:e=>{t=e}}},O="undefined"!=typeof window?window:Function("return this;")(),k=(e,t)=>((e,t)=>{let n=null!=t?t:O;for(let t=0;t{const t=F(v.none()),n=()=>t.get().each(e);return{clear:()=>{n(),t.set(v.none())},isSet:()=>t.get().isSome(),get:()=>t.get(),set:e=>{n(),t.set(v.some(e))}}},C=()=>T(e=>e.unbind()),A=(e,t,n=0,r)=>{const o=e.indexOf(t,n);return-1!==o&&(!!a(r)||o+t.length<=r)};var R=tinymce.util.Tools.resolve("tinymce.PluginManager");const L=e=>({isFullscreen:()=>null!==e.get()}),M=e=>{if(null==e)throw new Error("Node cannot be null or undefined");return{dom:e}},P=M,D=(e,t)=>{const n=e.dom;if(1!==n.nodeType)return!1;{const e=n;if(void 0!==e.matches)return e.matches(t);if(void 0!==e.msMatchesSelector)return e.msMatchesSelector(t);if(void 0!==e.webkitMatchesSelector)return e.webkitMatchesSelector(t);if(void 0!==e.mozMatchesSelector)return e.mozMatchesSelector(t);throw new Error("Browser lacks native selectors")}},N=()=>H(0,0),H=(e,t)=>({major:e,minor:t}),V={nu:H,detect:(e,t)=>{const n=String(t).toLowerCase();return 0===e.length?N():((e,t)=>{const n=((e,t)=>{for(let n=0;nNumber(t.replace(n,"$"+e));return H(r(1),r(2))})(e,n)},unknown:N},W=(e,t)=>{const n=String(t).toLowerCase();return x(e,e=>e.search(n))},q=/.*?version\/\ ?([0-9]+)\.([0-9]+).*/,B=e=>t=>A(t,e),I=[{name:"Edge",versionRegexes:[/.*?edge\/ ?([0-9]+)\.([0-9]+)$/],search:e=>A(e,"edge/")&&A(e,"chrome")&&A(e,"safari")&&A(e,"applewebkit")},{name:"Chromium",brand:"Chromium",versionRegexes:[/.*?chrome\/([0-9]+)\.([0-9]+).*/,q],search:e=>A(e,"chrome")&&!A(e,"chromeframe")},{name:"IE",versionRegexes:[/.*?msie\ ?([0-9]+)\.([0-9]+).*/,/.*?rv:([0-9]+)\.([0-9]+).*/],search:e=>A(e,"msie")||A(e,"trident")},{name:"Opera",versionRegexes:[q,/.*?opera\/([0-9]+)\.([0-9]+).*/],search:B("opera")},{name:"Firefox",versionRegexes:[/.*?firefox\/\ ?([0-9]+)\.([0-9]+).*/],search:B("firefox")},{name:"Safari",versionRegexes:[q,/.*?cpu os ([0-9]+)_([0-9]+).*/],search:e=>(A(e,"safari")||A(e,"mobile/"))&&A(e,"applewebkit")}],j=[{name:"Windows",search:B("win"),versionRegexes:[/.*?windows\ nt\ ?([0-9]+)\.([0-9]+).*/]},{name:"iOS",search:e=>A(e,"iphone")||A(e,"ipad"),versionRegexes:[/.*?version\/\ ?([0-9]+)\.([0-9]+).*/,/.*cpu os ([0-9]+)_([0-9]+).*/,/.*cpu iphone os ([0-9]+)_([0-9]+).*/]},{name:"Android",search:B("android"),versionRegexes:[/.*?android\ ?([0-9]+)\.([0-9]+).*/]},{name:"macOS",search:B("mac os x"),versionRegexes:[/.*?mac\ os\ x\ ?([0-9]+)_([0-9]+).*/]},{name:"Linux",search:B("linux"),versionRegexes:[]},{name:"Solaris",search:B("sunos"),versionRegexes:[]},{name:"FreeBSD",search:B("freebsd"),versionRegexes:[]},{name:"ChromeOS",search:B("cros"),versionRegexes:[/.*?chrome\/([0-9]+)\.([0-9]+).*/]}],_={browsers:h(I),oses:h(j)},z="Edge",K="Chromium",$="Opera",U="Firefox",X="Safari",Y=e=>{const t=e.current,n=e.version,r=e=>()=>t===e;return{current:t,version:n,isEdge:r(z),isChromium:r(K),isIE:r("IE"),isOpera:r($),isFirefox:r(U),isSafari:r(X)}},G=()=>Y({current:void 0,version:V.unknown()}),J=Y,Q=(h(z),h(K),h("IE"),h($),h(U),h(X),"Windows"),Z="Android",ee="Linux",te="macOS",ne="Solaris",re="FreeBSD",oe="ChromeOS",se=e=>{const t=e.current,n=e.version,r=e=>()=>t===e;return{current:t,version:n,isWindows:r(Q),isiOS:r("iOS"),isAndroid:r(Z),isMacOS:r(te),isLinux:r(ee),isSolaris:r(ne),isFreeBSD:r(re),isChromeOS:r(oe)}},ie=()=>se({current:void 0,version:V.unknown()}),le=se,ae=(h(Q),h("iOS"),h(Z),h(ee),h(te),h(ne),h(re),h(oe),(e,t,n)=>{const r=_.browsers(),o=_.oses(),s=t.bind(e=>((e,t)=>((e,t)=>{for(let n=0;n{const n=t.brand.toLowerCase();return x(e,e=>n===e.brand?.toLowerCase()).map(e=>({current:e.name,version:V.nu(parseInt(t.version,10),0)}))}))(r,e)).orThunk(()=>((e,t)=>W(e,t).map(e=>{const n=V.detect(e.versionRegexes,t);return{current:e.name,version:n}}))(r,e)).fold(G,J),i=((e,t)=>W(e,t).map(e=>{const n=V.detect(e.versionRegexes,t);return{current:e.name,version:n}}))(o,e).fold(ie,le),l=((e,t,n,r)=>{const o=e.isiOS()&&!0===/ipad/i.test(n),s=e.isiOS()&&!o,i=e.isiOS()||e.isAndroid(),l=i||r("(pointer:coarse)"),a=o||!s&&i&&r("(min-device-width:768px)"),c=s||i&&!a,u=t.isSafari()&&e.isiOS()&&!1===/safari/i.test(n),d=!c&&!a&&!u;return{isiPad:h(o),isiPhone:h(s),isTablet:h(a),isPhone:h(c),isTouch:h(l),isAndroid:e.isAndroid,isiOS:e.isiOS,isWebView:h(u),isDesktop:h(d)}})(i,s,e,n);return{browser:s,os:i,deviceType:l}}),ce=e=>window.matchMedia(e).matches;let ue=(e=>{let t,n=!1;return(...r)=>(n||(n=!0,t=e.apply(null,r)),t)})(()=>ae(window.navigator.userAgent,v.from(window.navigator.userAgentData),ce));const de=Object.getPrototypeOf,me=e=>{const t=k("ownerDocument.defaultView",e);return o(e)&&((e=>((e,t)=>{const n=((e,t)=>k(e,t))(e,t);if(null==n)throw new Error(e+" not available on this browser");return n})("HTMLElement",e))(t).prototype.isPrototypeOf(e)||/^HTML\w*Element$/.test(de(e).constructor.name))},he=e=>t=>(e=>e.dom.nodeType)(t)===e,ge=he(1),pe=he(3),fe=he(11),ve=e=>P(e.dom.ownerDocument),we=e=>y(e.dom.childNodes,P),ye=e=>{const t=(e=>P(e.dom.getRootNode()))(e);return fe(n=t)&&c(n.dom.host)?v.some(t):v.none();var n},be=e=>P(e.dom.host),Se=e=>{const t=P((e=>{if(c(e.target)){const t=P(e.target);if(ge(t)&&c(t.dom.shadowRoot)&&e.composed&&e.composedPath){const t=e.composedPath();if(t)return(e=>0e.stopPropagation(),r=()=>e.preventDefault(),o=(s=r,i=n,(...e)=>s(i.apply(null,e)));var s,i;return((e,t,n,r,o,s,i)=>({target:e,x:t,y:n,stop:r,prevent:o,kill:s,raw:i}))(t,e.clientX,e.clientY,n,r,o,e)},xe=(e,t,n,r)=>{e.dom.removeEventListener(t,n,r)},Ee=f,Fe=(e,t,n)=>((e,t,n,r)=>((e,t,n,r,o)=>{const s=((e,t)=>n=>{e(n)&&t(Se(n))})(n,r);return e.dom.addEventListener(t,s,o),{unbind:g(xe,e,t,s,o)}})(e,t,n,r,!1))(e,t,Ee,n),Oe=(e,t)=>{const n=e.dom.getAttribute(t);return null===n?void 0:n},ke=(e,t)=>{e.dom.removeAttribute(t)},Te=e=>void 0!==e.style&&u(e.style.getPropertyValue),Ce=e=>{const t=pe(e)?e.dom.parentNode:e.dom;if(null==t||null===t.ownerDocument)return!1;const n=t.ownerDocument;return ye(P(t)).fold(()=>n.body.contains(t),(r=Ce,o=be,e=>r(o(e))));var r,o},Ae=(e,t,n)=>{if(!r(n))throw console.error("Invalid call to CSS.set. Property ",t,":: Value ",n,":: Element ",e),new Error("CSS value must be a string: "+n);Te(e)&&e.style.setProperty(t,n)},Re=(e,t,n)=>{const r=e.dom;Ae(r,t,n)},Le=(e,t)=>{const n=e.dom;((e,t)=>{const n=E(e);for(let r=0,o=n.length;r{Ae(n,t,e)})},Me=(e,t)=>{const n=e.dom,r=window.getComputedStyle(n).getPropertyValue(t);return""!==r||Ce(e)?r:Pe(n,t)},Pe=(e,t)=>Te(e)?e.style.getPropertyValue(t):"",De=(e,t)=>({left:e,top:t,translate:(n,r)=>De(e+n,t+r)}),Ne=De,He=(e,t,n)=>((e,t,n)=>S(((e,t)=>{const n=u(t)?t:p;let r=e.dom;const o=[];for(;null!==r.parentNode&&void 0!==r.parentNode;){const e=r.parentNode,t=P(e);if(o.push(t),!0===n(t))break;r=e}return o})(e,n),t))(e,e=>D(e,t),n),Ve=(e,t)=>(e=>{return S((e=>v.from(e.dom.parentNode).map(P))(n=e).map(we).map(e=>S(e,e=>{return t=e,!(n.dom===t.dom);var t})).getOr([]),e=>D(e,t));var n})(e),We=e=>{const t=void 0===e?window:e;return ue().browser.isFirefox()?v.none():v.from(t.visualViewport)},qe=(e,t,n,r)=>({x:e,y:t,width:n,height:r,right:e+n,bottom:t+r}),Be=e=>{const t=void 0===e?window:e,n=t.document,r=(e=>{const t=void 0!==e?e.dom:document,n=t.body.scrollLeft||t.documentElement.scrollLeft,r=t.body.scrollTop||t.documentElement.scrollTop;return Ne(n,r)})(P(n));return We(t).fold(()=>{const e=t.document.documentElement,n=e.clientWidth,o=e.clientHeight;return qe(r.left,r.top,n,o)},e=>qe(Math.max(e.pageLeft,r.left),Math.max(e.pageTop,r.top),e.width,e.height))},Ie=(e,t,n)=>We(n).map(n=>{const r=e=>t(Se(e));return n.addEventListener(e,r),{unbind:()=>n.removeEventListener(e,r)}}).getOrThunk(()=>({unbind:m}));var je=tinymce.util.Tools.resolve("tinymce.dom.DOMUtils"),_e=tinymce.util.Tools.resolve("tinymce.Env");const ze=(e,t)=>{e.dispatch("FullscreenStateChanged",{state:t}),e.dispatch("ResizeEditor")},Ke=e=>e.options.get("fullscreen_native");const $e=e=>{return e.dom===(void 0!==(t=ve(e).dom).fullscreenElement?t.fullscreenElement:void 0!==t.msFullscreenElement?t.msFullscreenElement:void 0!==t.webkitFullscreenElement?t.webkitFullscreenElement:null);var t},Ue="data-ephox-mobile-fullscreen-style",Xe="position:absolute!important;",Ye="top:0!important;left:0!important;margin:0!important;padding:0!important;width:100%!important;height:100%!important;overflow:visible!important;",Ge=_e.os.isAndroid(),Je=(e,t,n)=>{const o=t=>n=>{const o=Oe(n,"style"),s=void 0===o?"no-styles":o.trim();s!==t&&(((e,t,n)=>{((e,t,n)=>{if(!(r(n)||l(n)||d(n)))throw console.error("Invalid call to Attribute.set. Key ",t,":: Value ",n,":: Element ",e),new Error("Attribute value was not simple");e.setAttribute(t,n+"")})(e.dom,t,n)})(n,Ue,s),Le(n,e.parseStyle(t)))},i=He(t,"*"),a=(e=>{const t=[];for(let n=0,r=e.length;nVe(e,"*:not(.tox-silver-sink)"))),c=(e=>{const t=Me(e,"background-color");return void 0!==t&&""!==t?"background-color:"+t+"!important":"background-color:rgb(255,255,255)!important;"})(n);b(a,o("display:none!important;")),b(i,o(Xe+Ye+c)),o((!0===Ge?"":Xe)+Ye+c)(t)},Qe=je.DOM,Ze=We().fold(()=>({bind:m,unbind:m}),e=>{const t=(()=>{const e=T(m);return{...e,on:t=>e.get().each(t)}})(),n=C(),r=C(),o=(e=>{let t=null;return{cancel:()=>{i(t)||(clearTimeout(t),t=null)},throttle:(...n)=>{i(t)&&(t=setTimeout(()=>{t=null,e.apply(null,n)},50))}}})(()=>{document.body.scrollTop=0,document.documentElement.scrollTop=0,window.requestAnimationFrame(()=>{t.on(t=>Le(t,{top:e.offsetTop+"px",left:e.offsetLeft+"px",height:e.height+"px",width:e.width+"px"}))})});return{bind:e=>{t.set(e),o.throttle(),n.set(Ie("resize",o.throttle)),r.set(Ie("scroll",o.throttle))},unbind:()=>{t.on(()=>{n.clear(),r.clear()}),t.clear()}}}),et=(e,t)=>{const n=document.body,r=document.documentElement,o=e.getContainer(),s=P(o),i=(l=s,v.from(l.dom.nextSibling).map(P)).filter(e=>(e=>ge(e)&&me(e.dom))(e)&&(e=>(e=>void 0!==e.dom.classList)(e)&&e.dom.classList.contains("tox-silver-sink"))(e));var l;const a=(e=>{const t=P(e.getElement());return ye(t).map(be).getOrThunk(()=>(e=>{const t=e.dom.body;if(null==t)throw new Error("Body is not available yet");return P(t)})(ve(t)))})(e),c=t.get(),u=P(e.getBody()),d=_e.deviceType.isTouch(),m=o.style,h=e.iframeElement,g=h?.style,p=e=>{e(n,"tox-fullscreen"),e(r,"tox-fullscreen"),e(o,"tox-fullscreen"),ye(s).map(e=>be(e).dom).each(t=>{e(t,"tox-fullscreen"),e(t,"tox-shadowhost")})},f=()=>{d&&(e=>{const t=(e=>{const t=document;return 1!==(n=t).nodeType&&9!==n.nodeType&&11!==n.nodeType||0===n.childElementCount?[]:y(t.querySelectorAll(e),P);var n})("["+Ue+"]");b(t,t=>{const n=Oe(t,Ue);n&&"no-styles"!==n?Le(t,e.parseStyle(n)):ke(t,"style"),ke(t,Ue)})})(e.dom),p(Qe.removeClass),Ze.unbind(),v.from(t.get()).each(e=>e.fullscreenChangeHandler.unbind())};if(c)c.fullscreenChangeHandler.unbind(),Ke(e)&&$e(a)&&(e=>{const t=e.dom;t.exitFullscreen?t.exitFullscreen():t.msExitFullscreen?t.msExitFullscreen():t.webkitCancelFullScreen&&t.webkitCancelFullScreen()})(ve(a)),g.width=c.iframeWidth,g.height=c.iframeHeight,m.width=c.containerWidth,m.height=c.containerHeight,m.top=c.containerTop,m.left=c.containerLeft,S=i,x=c.sinkCssPosition,E=(e,t)=>{Re(e,"position",t)},S.isSome()&&x.isSome()?v.some(E(S.getOrDie(),x.getOrDie())):v.none(),f(),w=c.scrollPos,window.scrollTo(w.x,w.y),t.set(null),ze(e,!1),e.off("remove",f);else{const n=Fe(ve(a),void 0!==document.fullscreenElement?"fullscreenchange":void 0!==document.msFullscreenElement?"MSFullscreenChange":void 0!==document.webkitFullscreenElement?"webkitfullscreenchange":"fullscreenchange",n=>{Ke(e)&&($e(a)||null===t.get()||et(e,t))}),r={scrollPos:Be(window),containerWidth:m.width,containerHeight:m.height,containerTop:m.top,containerLeft:m.left,iframeWidth:g.width,iframeHeight:g.height,fullscreenChangeHandler:n,sinkCssPosition:i.map(e=>Me(e,"position"))};d&&Je(e.dom,s,u),g.width=g.height="100%",m.width=m.height="",p(Qe.addClass),i.each(e=>{Re(e,"position","fixed")}),Ze.bind(s),e.on("remove",f),t.set(r),Ke(e)&&(e=>{const t=e.dom;t.requestFullscreen?t.requestFullscreen():t.msRequestFullscreen?t.msRequestFullscreen():t.webkitRequestFullScreen&&t.webkitRequestFullScreen()})(a),ze(e,!0)}var w,S,x,E};var tt=tinymce.util.Tools.resolve("tinymce.util.VK");const nt=(e,t)=>n=>{n.setActive(null!==t.get());const r=e=>n.setActive(e.state);return e.on("FullscreenStateChanged",r),()=>e.off("FullscreenStateChanged",r)},rt="fullscreen";R.add(rt,e=>{const t=F(null);return e.inline||((e=>{(0,e.options.register)("fullscreen_native",{processor:"boolean",default:!1})})(e),((e,t)=>{e.addCommand("mceFullScreen",()=>{et(e,t)})})(e,t),((e,t)=>{const n=()=>e.execCommand("mceFullScreen");e.ui.registry.addToggleMenuItem("fullscreen",{text:"Fullscreen",icon:"fullscreen",shortcut:"Meta+Shift+F",onAction:n,onSetup:nt(e,t),context:"any"}),e.ui.registry.addToggleButton("fullscreen",{tooltip:"Fullscreen",icon:"fullscreen",onAction:n,onSetup:nt(e,t),shortcut:"Meta+Shift+F",context:"any"})})(e,t),((e,t)=>{e.on("init",()=>{e.on("keydown",e=>{e.keyCode!==tt.TAB||e.metaKey||e.ctrlKey||!t.get()||e.preventDefault()})})})(e,t),e.addShortcut("Meta+Shift+F","","mceFullScreen")),{...L(t),getMetadata:()=>({name:"Full Screen",type:"opensource",slug:rt})}})}(); \ No newline at end of file diff --git a/public/assets/tinymce/plugins/help/plugin.js b/public/assets/tinymce/plugins/help/plugin.js index 08c8cbde4..06e75a776 100644 --- a/public/assets/tinymce/plugins/help/plugin.js +++ b/public/assets/tinymce/plugins/help/plugin.js @@ -1,5 +1,5 @@ /** - * TinyMCE version 8.1.2 (TBD) + * TinyMCE version 8.10.0 (2026-10-14) */ (function () { @@ -7,13 +7,12 @@ /* eslint-disable @typescript-eslint/no-wrapper-object-types */ const hasProto = (v, constructor, predicate) => { - var _a; if (predicate(v, constructor.prototype)) { return true; } else { // String-based fallback time - return ((_a = v.constructor) === null || _a === void 0 ? void 0 : _a.name) === constructor.name; + return v.constructor?.name === constructor.name; } }; const typeOf = (x) => { @@ -33,20 +32,12 @@ }; const isType = (type) => (value) => typeOf(value) === type; const isSimpleType = (type) => (value) => typeof value === type; - const eq = (t) => (a) => t === a; const isString = isType('string'); - const isUndefined = eq(undefined); + const isObject = isType('object'); const isNullable = (a) => a === null || a === undefined; const isNonNullable = (a) => !isNullable(a); const isFunction = isSimpleType('function'); - const constant = (value) => { - return () => { - return value; - }; - }; - const never = constant(false); - /** * The `Optional` type represents a value (of any type) that potentially does * not exist. Any `Optional` can either be a `Some` (in which case the @@ -63,6 +54,11 @@ * strict-null-checks */ class Optional { + tag; + value; + // Sneaky optimisation: every instance of Optional.none is identical, so just + // reuse the same object + static singletonNone = new Optional(false); // The internal representation has a `tag` and a `value`, but both are // private: able to be console.logged, but not able to be accessed by code constructor(tag, value) { @@ -230,7 +226,7 @@ */ getOrDie(message) { if (!this.tag) { - throw new Error(message !== null && message !== void 0 ? message : 'Called getOrDie on None'); + throw new Error(message ?? 'Called getOrDie on None'); } else { return this.value; @@ -294,9 +290,6 @@ return this.tag ? `some(${this.value})` : 'none()'; } } - // Sneaky optimisation: every instance of Optional.none is identical, so just - // reuse the same object - Optional.singletonNone = new Optional(false); const nativeSlice = Array.prototype.slice; const nativeIndexOf = Array.prototype.indexOf; @@ -323,21 +316,6 @@ } return r; }; - const findUntil = (xs, pred, until) => { - for (let i = 0, len = xs.length; i < len; i++) { - const x = xs[i]; - if (pred(x, i)) { - return Optional.some(x); - } - else if (until(x, i)) { - break; - } - } - return Optional.none(); - }; - const find = (xs, pred) => { - return findUntil(xs, pred, never); - }; const sort = (xs, comparator) => { const copy = nativeSlice.call(xs, 0); copy.sort(comparator); @@ -413,8 +391,7 @@ const get = (customTabs) => { const addTab = (spec) => { - var _a; - const name = (_a = spec.name) !== null && _a !== void 0 ? _a : generate('tab-name'); + const name = spec.name ?? generate('tab-name'); const currentCustomTabs = customTabs.get(); currentCustomTabs[name] = spec; customTabs.set(currentCustomTabs); @@ -557,150 +534,67 @@ }; }; - // These lists are automatically sorted when generating the dialog. - const urls = map([ - { key: 'accordion', name: 'Accordion' }, - { key: 'anchor', name: 'Anchor' }, - { key: 'autolink', name: 'Autolink' }, - { key: 'autoresize', name: 'Autoresize' }, - { key: 'autosave', name: 'Autosave' }, - { key: 'charmap', name: 'Character Map' }, - { key: 'code', name: 'Code' }, - { key: 'codesample', name: 'Code Sample' }, - { key: 'colorpicker', name: 'Color Picker' }, - { key: 'directionality', name: 'Directionality' }, - { key: 'emoticons', name: 'Emoticons' }, - { key: 'fullscreen', name: 'Full Screen' }, - { key: 'help', name: 'Help' }, - { key: 'image', name: 'Image' }, - { key: 'importcss', name: 'Import CSS' }, - { key: 'insertdatetime', name: 'Insert Date/Time' }, - { key: 'link', name: 'Link' }, - { key: 'lists', name: 'Lists' }, - { key: 'advlist', name: 'List Styles' }, - { key: 'media', name: 'Media' }, - { key: 'nonbreaking', name: 'Nonbreaking' }, - { key: 'pagebreak', name: 'Page Break' }, - { key: 'preview', name: 'Preview' }, - { key: 'quickbars', name: 'Quick Toolbars' }, - { key: 'save', name: 'Save' }, - { key: 'searchreplace', name: 'Search and Replace' }, - { key: 'table', name: 'Table' }, - { key: 'textcolor', name: 'Text Color' }, - { key: 'visualblocks', name: 'Visual Blocks' }, - { key: 'visualchars', name: 'Visual Characters' }, - { key: 'wordcount', name: 'Word Count' }, - // TODO: Add other premium plugins when they are included in the website - { key: 'a11ychecker', name: 'Accessibility Checker', type: "premium" /* PluginType.Premium */ }, - { key: 'typography', name: 'Advanced Typography', type: "premium" /* PluginType.Premium */, slug: 'advanced-typography' }, - { key: 'ai', name: 'AI Assistant', type: "premium" /* PluginType.Premium */ }, - { key: 'casechange', name: 'Case Change', type: "premium" /* PluginType.Premium */ }, - { key: 'checklist', name: 'Checklist', type: "premium" /* PluginType.Premium */ }, - { key: 'advcode', name: 'Enhanced Code Editor', type: "premium" /* PluginType.Premium */ }, - { key: 'mediaembed', name: 'Enhanced Media Embed', type: "premium" /* PluginType.Premium */, slug: 'introduction-to-mediaembed' }, - { key: 'advtable', name: 'Enhanced Tables', type: "premium" /* PluginType.Premium */ }, - { key: 'exportpdf', name: 'Export to PDF', type: "premium" /* PluginType.Premium */ }, - { key: 'exportword', name: 'Export to Word', type: "premium" /* PluginType.Premium */ }, - { key: 'footnotes', name: 'Footnotes', type: "premium" /* PluginType.Premium */ }, - { key: 'formatpainter', name: 'Format Painter', type: "premium" /* PluginType.Premium */ }, - { key: 'editimage', name: 'Image Editing', type: "premium" /* PluginType.Premium */ }, - { key: 'uploadcare', name: 'Image Optimizer Powered by Uploadcare', type: "premium" /* PluginType.Premium */ }, - { key: 'importword', name: 'Import from Word', type: "premium" /* PluginType.Premium */ }, - { key: 'inlinecss', name: 'Inline CSS', type: "premium" /* PluginType.Premium */, slug: 'inline-css' }, - { key: 'linkchecker', name: 'Link Checker', type: "premium" /* PluginType.Premium */ }, - { key: 'math', name: 'Math', type: "premium" /* PluginType.Premium */ }, - { key: 'markdown', name: 'Markdown', type: "premium" /* PluginType.Premium */ }, - { key: 'mentions', name: 'Mentions', type: "premium" /* PluginType.Premium */ }, - { key: 'mergetags', name: 'Merge Tags', type: "premium" /* PluginType.Premium */ }, - { key: 'pageembed', name: 'Page Embed', type: "premium" /* PluginType.Premium */ }, - { key: 'permanentpen', name: 'Permanent Pen', type: "premium" /* PluginType.Premium */ }, - { key: 'powerpaste', name: 'PowerPaste', type: "premium" /* PluginType.Premium */, slug: 'introduction-to-powerpaste' }, - { key: 'revisionhistory', name: 'Revision History', type: "premium" /* PluginType.Premium */ }, - { key: 'tinymcespellchecker', name: 'Spell Checker', type: "premium" /* PluginType.Premium */, slug: 'introduction-to-tiny-spellchecker' }, - { key: 'suggestededits', name: 'Suggested Edits', type: "premium" /* PluginType.Premium */ }, - { key: 'autocorrect', name: 'Spelling Autocorrect', type: "premium" /* PluginType.Premium */ }, - { key: 'tableofcontents', name: 'Table of Contents', type: "premium" /* PluginType.Premium */ }, - { key: 'advtemplate', name: 'Templates', type: "premium" /* PluginType.Premium */, slug: 'advanced-templates' }, - { key: 'tinycomments', name: 'Tiny Comments', type: "premium" /* PluginType.Premium */, slug: 'introduction-to-tiny-comments' }, - { key: 'tinydrive', name: 'Tiny Drive', type: "premium" /* PluginType.Premium */, slug: 'tinydrive-introduction' }, - ], (item) => ({ - ...item, - // Set the defaults/fallbacks for the plugin urls - type: item.type || "opensource" /* PluginType.OpenSource */, - slug: item.slug || item.key - })); - + const pricingUrl = 'https://www.tiny.cloud/pricing/?utm_campaign=help_dialog_plugin_tab&utm_source=tiny&utm_medium=referral&utm_term=read_more&utm_content=premium_plugin_heading'; + const withPremiumMarker = (name) => `${name}*`; + const buildLink = (name, url) => `${name}`; + const buildDocsUrl = (slug) => `https://www.tiny.cloud/docs/tinymce/${tinymce.majorVersion}/${slug}/`; + const isUsableMetadata = (metadata) => isObject(metadata) && 'name' in metadata && isString(metadata.name); + const getUsableMetadata = (getMetadata) => { + try { + return Optional.from(getMetadata()).filter(isUsableMetadata); + } + catch { + return Optional.none(); + } + }; + const readPluginMetadata = (editor, key) => get$1(editor.plugins, key) + .bind((plugin) => Optional.from(plugin.getMetadata)) + .filter(isFunction) + .bind(getUsableMetadata); + const isTypedMetadata = (metadata) => 'slug' in metadata && + isString(metadata.slug) && + (metadata.type === 'premium' || metadata.type === 'opensource'); + const isUrlMetadata = (metadata) => 'url' in metadata && isString(metadata.url); + const toEntry = (metadata) => { + const name = metadata.name; + if (isTypedMetadata(metadata)) { + const displayName = metadata.type === 'premium' ? withPremiumMarker(name) : name; + return { name, html: buildLink(displayName, buildDocsUrl(metadata.slug)) }; + } + else if (isUrlMetadata(metadata)) { + return { name, html: buildLink(name, metadata.url) }; + } + else { + return { name, html: name }; + } + }; + const buildPluginEntry = (editor, key) => readPluginMetadata(editor, key).fold(() => Optional.some({ name: key, html: key }), (metadata) => metadata.hidden === true ? Optional.none() : Optional.some(toEntry(metadata))); + const getVisiblePluginKeys = (editor) => { + const keys$1 = keys(editor.plugins); + const forced = Optional.from(getForcedPlugins(editor)).getOr([]); + return filter(keys$1, (k) => !contains(forced, k)); + }; + const renderPremiumFooter = () => { + const learnMoreLink = `` + + global$2.translate('Learn more...') + + ''; + return ''; + }; + const renderPluginList = (editor) => { + const keys = getVisiblePluginKeys(editor); + const entries = cat(map(keys, (k) => buildPluginEntry(editor, k))); + const sorted = sort(entries, (a, b) => a.name.localeCompare(b.name)); + const pluginLis = map(sorted, (entry) => '
    • ' + entry.html + '
    • ').join(''); + const heading = '

      ' + global$2.translate(['Plugins installed ({0}):', sorted.length]) + '

      '; + return heading + '
        ' + pluginLis + '
      ' + renderPremiumFooter(); + }; const tab$1 = (editor) => { - const availablePlugins = () => { - const premiumPlugins = filter(urls, ({ type }) => { - return type === "premium" /* PluginUrls.PluginType.Premium */; - }); - const sortedPremiumPlugins = sort(map(premiumPlugins, (p) => p.name), (s1, s2) => s1.localeCompare(s2)); - const premiumPluginList = map(sortedPremiumPlugins, (pluginName) => `
    • ${pluginName}
    • `).join(''); - return '
      ' + - '

      ' + global$2.translate('Premium plugins:') + '

      ' + - '' + - '
      '; - }; - const makeLink = (p) => `${p.name}`; - const identifyUnknownPlugin = (editor, key) => { - const getMetadata = editor.plugins[key].getMetadata; - if (isFunction(getMetadata)) { - const metadata = getMetadata(); - return { name: metadata.name, html: makeLink(metadata) }; - } - else { - return { name: key, html: key }; - } - }; - const getPluginData = (editor, key) => find(urls, (x) => { - return x.key === key; - }).fold(() => { - return identifyUnknownPlugin(editor, key); - }, (x) => { - // We know this plugin, so use our stored details. - const name = x.type === "premium" /* PluginUrls.PluginType.Premium */ ? `${x.name}*` : x.name; - const html = makeLink({ name, url: `https://www.tiny.cloud/docs/tinymce/${tinymce.majorVersion}/${x.slug}/` }); - return { name, html }; - }); - const getPluginKeys = (editor) => { - const keys$1 = keys(editor.plugins); - const forcedPlugins = getForcedPlugins(editor); - const hiddenPlugins = isUndefined(forcedPlugins) ? ['onboarding'] : forcedPlugins.concat(['onboarding']); - return filter(keys$1, (k) => !contains(hiddenPlugins, k)); - }; - const pluginLister = (editor) => { - const pluginKeys = getPluginKeys(editor); - const sortedPluginData = sort(map(pluginKeys, (k) => getPluginData(editor, k)), (pd1, pd2) => pd1.name.localeCompare(pd2.name)); - const pluginLis = map(sortedPluginData, (key) => { - return '
    • ' + key.html + '
    • '; - }); - const count = pluginLis.length; - const pluginsString = pluginLis.join(''); - const html = '

      ' + global$2.translate(['Plugins installed ({0}):', count]) + '

      ' + - '
        ' + pluginsString + '
      '; - return html; - }; - const installedPlugins = (editor) => { - if (editor == null) { - return ''; - } - return '
      ' + - pluginLister(editor) + - '
      '; - }; const htmlPanel = { type: 'htmlpanel', presets: 'document', - html: [ - installedPlugins(editor), - availablePlugins() - ].join('') + html: editor == null ? '' : '
      ' + renderPluginList(editor) + '
      ' }; return { name: 'plugins', @@ -734,7 +628,6 @@ const parseHelpTabsSetting = (tabsFromSettings, tabs) => { const newTabs = {}; const names = map(tabsFromSettings, (t) => { - var _a; if (isString(t)) { // Code below shouldn't care if a tab name doesn't have a spec. // If we find it does, we'll need to make this smarter. @@ -745,7 +638,7 @@ return t; } else { - const name = (_a = t.name) !== null && _a !== void 0 ? _a : generate('tab-name'); + const name = t.name ?? generate('tab-name'); newTabs[name] = t; return name; } @@ -802,8 +695,9 @@ }); }; + const PLUGIN_CODE = 'help'; var Plugin = () => { - global$4.add('help', (editor, pluginUrl) => { + global$4.add(PLUGIN_CODE, (editor, pluginUrl) => { const customTabs = Cell({}); const api = get(customTabs); register$1(editor); @@ -812,7 +706,10 @@ register$2(editor, dialogOpener); editor.shortcuts.add('Alt+0', 'Open help dialog', 'mceHelp'); initI18nLoad(editor, pluginUrl); - return api; + return { + ...api, + getMetadata: () => ({ name: 'Help', type: 'opensource', slug: PLUGIN_CODE }) + }; }); }; diff --git a/public/assets/tinymce/plugins/help/plugin.min.js b/public/assets/tinymce/plugins/help/plugin.min.js index e7ce206d0..95598768a 100644 --- a/public/assets/tinymce/plugins/help/plugin.min.js +++ b/public/assets/tinymce/plugins/help/plugin.min.js @@ -1 +1 @@ -!function(){"use strict";const e=e=>"string"===(e=>{const t=typeof e;return null===e?"null":"object"===t&&Array.isArray(e)?"array":"object"===t&&(n=a=e,(r=String).prototype.isPrototypeOf(n)||(null===(o=a.constructor)||void 0===o?void 0:o.name)===r.name)?"string":t;var n,a,r,o})(e);const t=e=>undefined===e;const n=e=>"function"==typeof e,a=()=>false;class r{constructor(e,t){this.tag=e,this.value=t}static some(e){return new r(!0,e)}static none(){return r.singletonNone}fold(e,t){return this.tag?t(this.value):e()}isSome(){return this.tag}isNone(){return!this.tag}map(e){return this.tag?r.some(e(this.value)):r.none()}bind(e){return this.tag?e(this.value):r.none()}exists(e){return this.tag&&e(this.value)}forall(e){return!this.tag||e(this.value)}filter(e){return!this.tag||e(this.value)?this:r.none()}getOr(e){return this.tag?this.value:e}or(e){return this.tag?this:e}getOrThunk(e){return this.tag?this.value:e()}orThunk(e){return this.tag?this:e()}getOrDie(e){if(this.tag)return this.value;throw new Error(null!=e?e:"Called getOrDie on None")}static from(e){return null==e?r.none():r.some(e)}getOrNull(){return this.tag?this.value:null}getOrUndefined(){return this.value}each(e){this.tag&&e(this.value)}toArray(){return this.tag?[this.value]:[]}toString(){return this.tag?`some(${this.value})`:"none()"}}r.singletonNone=new r(!1);const o=Array.prototype.slice,i=Array.prototype.indexOf,s=(e,t)=>{const n=e.length,a=new Array(n);for(let r=0;r{const n=[];for(let a=0,r=e.length;a{const n=o.call(e,0);return n.sort(t),n};n(Array.from)&&Array.from;const l=Object.keys,u=Object.hasOwnProperty,p=(e,t)=>u.call(e,t);let y=0;const h=e=>{const t=(new Date).getTime(),n=Math.floor(window.crypto.getRandomValues(new Uint32Array(1))[0]/4294967295*1e9);return y++,e+"_"+n+y+String(t)};var d=tinymce.util.Tools.resolve("tinymce.PluginManager");const g=e=>t=>t.options.get(e),k=g("help_tabs"),v=g("forced_plugins");var b=tinymce.util.Tools.resolve("tinymce.Resource"),f=tinymce.util.Tools.resolve("tinymce.util.I18n");const A=(e,t)=>b.load(`tinymce.html-i18n.help-keynav.${t}`,`${e}/js/i18n/keynav/${t}.js`),w=e=>A(e,f.getCode()).catch((()=>A(e,"en")));var C=tinymce.util.Tools.resolve("tinymce.Env");const S=e=>{const t=C.os.isMacOS()||C.os.isiOS(),n=t?{alt:"⌥",ctrl:"⌃",shift:"⇧",meta:"⌘",access:"⌃⌥"}:{meta:"Ctrl ",access:"Shift + Alt "},a=e.split("+"),r=s(a,(e=>{const t=e.toLowerCase().trim();return p(n,t)?n[t]:e}));return t?r.join("").replace(/\s/,""):r.join("+")},M=[{shortcuts:["Meta + B"],action:"Bold"},{shortcuts:["Meta + I"],action:"Italic"},{shortcuts:["Meta + U"],action:"Underline"},{shortcuts:["Meta + A"],action:"Select all"},{shortcuts:["Meta + Y","Meta + Shift + Z"],action:"Redo"},{shortcuts:["Meta + Z"],action:"Undo"},{shortcuts:["Access + 1"],action:"Heading 1"},{shortcuts:["Access + 2"],action:"Heading 2"},{shortcuts:["Access + 3"],action:"Heading 3"},{shortcuts:["Access + 4"],action:"Heading 4"},{shortcuts:["Access + 5"],action:"Heading 5"},{shortcuts:["Access + 6"],action:"Heading 6"},{shortcuts:["Access + 7"],action:"Paragraph"},{shortcuts:["Access + 8"],action:"Div"},{shortcuts:["Access + 9"],action:"Address"},{shortcuts:["Alt + 0"],action:"Open help dialog"},{shortcuts:["Alt + F9"],action:"Focus to menubar"},{shortcuts:["Alt + F10"],action:"Focus to toolbar"},{shortcuts:["Alt + F11"],action:"Focus to element path"},{shortcuts:["Alt + F12"],action:"Focus to notification"},{shortcuts:["Ctrl + F9"],action:"Focus to contextual toolbar"},{shortcuts:["Shift + Enter"],action:"Open popup menu for split buttons"},{shortcuts:["Meta + K"],action:"Insert link (if link plugin activated)"},{shortcuts:["Meta + S"],action:"Save (if save plugin activated)"},{shortcuts:["Meta + F"],action:"Find (if searchreplace plugin activated)"},{shortcuts:["Meta + Shift + F"],action:"Switch to or from fullscreen mode"}],_=()=>({name:"shortcuts",title:"Handy Shortcuts",items:[{type:"table",header:["Action","Shortcut"],cells:s(M,(e=>{const t=s(e.shortcuts,S).join(" or ");return[e.action,t]}))}]}),x=s([{key:"accordion",name:"Accordion"},{key:"anchor",name:"Anchor"},{key:"autolink",name:"Autolink"},{key:"autoresize",name:"Autoresize"},{key:"autosave",name:"Autosave"},{key:"charmap",name:"Character Map"},{key:"code",name:"Code"},{key:"codesample",name:"Code Sample"},{key:"colorpicker",name:"Color Picker"},{key:"directionality",name:"Directionality"},{key:"emoticons",name:"Emoticons"},{key:"fullscreen",name:"Full Screen"},{key:"help",name:"Help"},{key:"image",name:"Image"},{key:"importcss",name:"Import CSS"},{key:"insertdatetime",name:"Insert Date/Time"},{key:"link",name:"Link"},{key:"lists",name:"Lists"},{key:"advlist",name:"List Styles"},{key:"media",name:"Media"},{key:"nonbreaking",name:"Nonbreaking"},{key:"pagebreak",name:"Page Break"},{key:"preview",name:"Preview"},{key:"quickbars",name:"Quick Toolbars"},{key:"save",name:"Save"},{key:"searchreplace",name:"Search and Replace"},{key:"table",name:"Table"},{key:"textcolor",name:"Text Color"},{key:"visualblocks",name:"Visual Blocks"},{key:"visualchars",name:"Visual Characters"},{key:"wordcount",name:"Word Count"},{key:"a11ychecker",name:"Accessibility Checker",type:"premium"},{key:"typography",name:"Advanced Typography",type:"premium",slug:"advanced-typography"},{key:"ai",name:"AI Assistant",type:"premium"},{key:"casechange",name:"Case Change",type:"premium"},{key:"checklist",name:"Checklist",type:"premium"},{key:"advcode",name:"Enhanced Code Editor",type:"premium"},{key:"mediaembed",name:"Enhanced Media Embed",type:"premium",slug:"introduction-to-mediaembed"},{key:"advtable",name:"Enhanced Tables",type:"premium"},{key:"exportpdf",name:"Export to PDF",type:"premium"},{key:"exportword",name:"Export to Word",type:"premium"},{key:"footnotes",name:"Footnotes",type:"premium"},{key:"formatpainter",name:"Format Painter",type:"premium"},{key:"editimage",name:"Image Editing",type:"premium"},{key:"uploadcare",name:"Image Optimizer Powered by Uploadcare",type:"premium"},{key:"importword",name:"Import from Word",type:"premium"},{key:"inlinecss",name:"Inline CSS",type:"premium",slug:"inline-css"},{key:"linkchecker",name:"Link Checker",type:"premium"},{key:"math",name:"Math",type:"premium"},{key:"markdown",name:"Markdown",type:"premium"},{key:"mentions",name:"Mentions",type:"premium"},{key:"mergetags",name:"Merge Tags",type:"premium"},{key:"pageembed",name:"Page Embed",type:"premium"},{key:"permanentpen",name:"Permanent Pen",type:"premium"},{key:"powerpaste",name:"PowerPaste",type:"premium",slug:"introduction-to-powerpaste"},{key:"revisionhistory",name:"Revision History",type:"premium"},{key:"tinymcespellchecker",name:"Spell Checker",type:"premium",slug:"introduction-to-tiny-spellchecker"},{key:"suggestededits",name:"Suggested Edits",type:"premium"},{key:"autocorrect",name:"Spelling Autocorrect",type:"premium"},{key:"tableofcontents",name:"Table of Contents",type:"premium"},{key:"advtemplate",name:"Templates",type:"premium",slug:"advanced-templates"},{key:"tinycomments",name:"Tiny Comments",type:"premium",slug:"introduction-to-tiny-comments"},{key:"tinydrive",name:"Tiny Drive",type:"premium",slug:"tinydrive-introduction"}],(e=>({...e,type:e.type||"opensource",slug:e.slug||e.key}))),T=e=>{const o=e=>`${e.name}`,u=(e,t)=>{return(i=x,s=e=>e.key===t,((e,t,n)=>{for(let a=0,o=e.length;a((e,t)=>{const a=e.plugins[t].getMetadata;if(n(a)){const e=a();return{name:e.name,html:o(e)}}return{name:t,html:t}})(e,t)),(e=>{const t="premium"===e.type?`${e.name}*`:e.name;return{name:t,html:o({name:t,url:`https://www.tiny.cloud/docs/tinymce/${tinymce.majorVersion}/${e.slug}/`})}}));var i,s},p=e=>{const n=(e=>{const n=l(e.plugins),a=v(e),r=t(a)?["onboarding"]:a.concat(["onboarding"]);return m(n,(e=>!(((e,t)=>i.call(e,t))(r,e)>-1)))})(e),a=c(s(n,(t=>u(e,t))),((e,t)=>e.name.localeCompare(t.name))),r=s(a,(e=>"
    • "+e.html+"
    • ")),o=r.length,p=r.join("");return"

      "+f.translate(["Plugins installed ({0}):",o])+"

        "+p+"
      "},y={type:"htmlpanel",presets:"document",html:[(e=>null==e?"":"
      "+p(e)+"
      ")(e),(()=>{const e=m(x,(({type:e})=>"premium"===e)),t=c(s(e,(e=>e.name)),((e,t)=>e.localeCompare(t))),n=s(t,(e=>`
    • ${e}
    • `)).join("");return"

      "+f.translate("Premium plugins:")+"

      "})()].join("")};return{name:"plugins",title:"Plugins",items:[y]}};var O=tinymce.util.Tools.resolve("tinymce.EditorManager");const P=(t,n,a)=>()=>{(async(t,n,a)=>{const o=_(),i=await(async e=>({name:"keyboardnav",title:"Keyboard Navigation",items:[{type:"htmlpanel",presets:"document",html:await w(e)}]}))(a),m=T(t),c=(()=>{var e,t;const n='TinyMCE '+(e=O.majorVersion,t=O.minorVersion,(0===e.indexOf("@")?"X.X.X":e+"."+t)+"");return{name:"versions",title:"Version",items:[{type:"htmlpanel",html:"

      "+f.translate(["You are using {0}",n])+"

      ",presets:"document"}]}})(),u={[o.name]:o,[i.name]:i,[m.name]:m,[c.name]:c,...n.get()};return r.from(k(t)).fold((()=>(e=>{const t=l(e),n=t.indexOf("versions");return-1!==n&&(t.splice(n,1),t.push("versions")),{tabs:e,names:t}})(u)),(t=>((t,n)=>{const a={},r=s(t,(t=>{var r;if(e(t))return p(n,t)&&(a[t]=n[t]),t;{const e=null!==(r=t.name)&&void 0!==r?r:h("tab-name");return a[e]=t,e}}));return{tabs:a,names:r}})(t,u)))})(t,n,a).then((({tabs:e,names:n})=>{const a={type:"tabpanel",tabs:(e=>{const t=[],n=e=>{t.push(e)};for(let t=0;t{return p(n=e,a=t)?r.from(n[a]):r.none();var n,a})))};t.windowManager.open({title:"Help",size:"medium",body:a,buttons:[{type:"cancel",name:"close",text:"Close",primary:!0}],initialData:{}})}))};d.add("help",((e,t)=>{const n=(()=>{let e={};return{get:()=>e,set:t=>{e=t}}})(),a=(e=>({addTab:t=>{var n;const a=null!==(n=t.name)&&void 0!==n?n:h("tab-name"),r=e.get();r[a]=t,e.set(r)}}))(n);(e=>{(0,e.options.register)("help_tabs",{processor:"array"})})(e);const r=P(e,n,t);return((e,t)=>{e.ui.registry.addButton("help",{icon:"help",tooltip:"Help",onAction:t,context:"any"}),e.ui.registry.addMenuItem("help",{text:"Help",icon:"help",shortcut:"Alt+0",onAction:t,context:"any"})})(e,r),((e,t)=>{e.addCommand("mceHelp",t)})(e,r),e.shortcuts.add("Alt+0","Open help dialog","mceHelp"),((e,t)=>{e.on("init",(()=>{w(t)}))})(e,t),a}))}(); \ No newline at end of file +!function(){"use strict";const t=t=>e=>(t=>{const e=typeof t;return null===t?"null":"object"===e&&Array.isArray(t)?"array":"object"===e&&(n=r=t,(s=String).prototype.isPrototypeOf(n)||r.constructor?.name===s.name)?"string":e;var n,r,s})(e)===t,e=t("string"),n=t("object"),r=t=>"function"==typeof t;class s{tag;value;static singletonNone=new s(!1);constructor(t,e){this.tag=t,this.value=e}static some(t){return new s(!0,t)}static none(){return s.singletonNone}fold(t,e){return this.tag?e(this.value):t()}isSome(){return this.tag}isNone(){return!this.tag}map(t){return this.tag?s.some(t(this.value)):s.none()}bind(t){return this.tag?t(this.value):s.none()}exists(t){return this.tag&&t(this.value)}forall(t){return!this.tag||t(this.value)}filter(t){return!this.tag||t(this.value)?this:s.none()}getOr(t){return this.tag?this.value:t}or(t){return this.tag?this:t}getOrThunk(t){return this.tag?this.value:t()}orThunk(t){return this.tag?this:t()}getOrDie(t){if(this.tag)return this.value;throw new Error(t??"Called getOrDie on None")}static from(t){return null==t?s.none():s.some(t)}getOrNull(){return this.tag?this.value:null}getOrUndefined(){return this.value}each(t){this.tag&&t(this.value)}toArray(){return this.tag?[this.value]:[]}toString(){return this.tag?`some(${this.value})`:"none()"}}const o=Array.prototype.slice,a=Array.prototype.indexOf,i=(t,e)=>{const n=t.length,r=new Array(n);for(let s=0;sh(t,e)?s.from(t[e]):s.none(),h=(t,e)=>l.call(t,e);let m=0;const p=t=>{const e=(new Date).getTime(),n=Math.floor(window.crypto.getRandomValues(new Uint32Array(1))[0]/4294967295*1e9);return m++,t+"_"+n+m+String(e)},g=t=>{const e=[],n=t=>{e.push(t)};for(let e=0;ee=>e.options.get(t),f=y("help_tabs"),v=y("forced_plugins");var b=tinymce.util.Tools.resolve("tinymce.Resource"),A=tinymce.util.Tools.resolve("tinymce.util.I18n");const _=(t,e)=>b.load(`tinymce.html-i18n.help-keynav.${e}`,`${t}/js/i18n/keynav/${e}.js`),w=t=>_(t,A.getCode()).catch(()=>_(t,"en"));var M=tinymce.util.Tools.resolve("tinymce.Env");const x=t=>{const e=M.os.isMacOS()||M.os.isiOS(),n=e?{alt:"⌥",ctrl:"⌃",shift:"⇧",meta:"⌘",access:"⌃⌥"}:{meta:"Ctrl ",access:"Shift + Alt "},r=t.split("+"),s=i(r,t=>{const e=t.toLowerCase().trim();return h(n,e)?n[e]:t});return e?s.join("").replace(/\s/,""):s.join("+")},O=[{shortcuts:["Meta + B"],action:"Bold"},{shortcuts:["Meta + I"],action:"Italic"},{shortcuts:["Meta + U"],action:"Underline"},{shortcuts:["Meta + A"],action:"Select all"},{shortcuts:["Meta + Y","Meta + Shift + Z"],action:"Redo"},{shortcuts:["Meta + Z"],action:"Undo"},{shortcuts:["Access + 1"],action:"Heading 1"},{shortcuts:["Access + 2"],action:"Heading 2"},{shortcuts:["Access + 3"],action:"Heading 3"},{shortcuts:["Access + 4"],action:"Heading 4"},{shortcuts:["Access + 5"],action:"Heading 5"},{shortcuts:["Access + 6"],action:"Heading 6"},{shortcuts:["Access + 7"],action:"Paragraph"},{shortcuts:["Access + 8"],action:"Div"},{shortcuts:["Access + 9"],action:"Address"},{shortcuts:["Alt + 0"],action:"Open help dialog"},{shortcuts:["Alt + F9"],action:"Focus to menubar"},{shortcuts:["Alt + F10"],action:"Focus to toolbar"},{shortcuts:["Alt + F11"],action:"Focus to element path"},{shortcuts:["Alt + F12"],action:"Focus to notification"},{shortcuts:["Ctrl + F9"],action:"Focus to contextual toolbar"},{shortcuts:["Shift + Enter"],action:"Open popup menu for split buttons"},{shortcuts:["Meta + K"],action:"Insert link (if link plugin activated)"},{shortcuts:["Meta + S"],action:"Save (if save plugin activated)"},{shortcuts:["Meta + F"],action:"Find (if searchreplace plugin activated)"},{shortcuts:["Meta + Shift + F"],action:"Switch to or from fullscreen mode"}],S=()=>({name:"shortcuts",title:"Handy Shortcuts",items:[{type:"table",header:["Action","Shortcut"],cells:i(O,t=>{const e=i(t.shortcuts,x).join(" or ");return[t.action,e]})}]}),j=(t,e)=>`${t}`,F=t=>n(t)&&"name"in t&&e(t.name),H=t=>{try{return s.from(t()).filter(F)}catch{return s.none()}},k=(t,n)=>((t,e)=>u(t.plugins,e).bind(t=>s.from(t.getMetadata)).filter(r).bind(H))(t,n).fold(()=>s.some({name:n,html:n}),t=>!0===t.hidden?s.none():s.some((t=>{const n=t.name;if((t=>"slug"in t&&e(t.slug)&&("premium"===t.type||"opensource"===t.type))(t)){const e="premium"===t.type?(t=>`${t}*`)(n):n;return{name:n,html:j(e,(r=t.slug,`https://www.tiny.cloud/docs/tinymce/${tinymce.majorVersion}/${r}/`))}}return(t=>"url"in t&&e(t.url))(t)?{name:n,html:j(n,t.url)}:{name:n,html:n};var r})(t))),T=t=>{const e=c(t.plugins),n=s.from(v(t)).getOr([]);return((t,e)=>{const n=[];for(let r=0,s=t.length;r{return e=n,r=t,!(a.call(e,r)>-1);var e,r})},C=t=>{const e=T(t),n=(t=>{const e=o.call(t,0);return e.sort((t,e)=>t.name.localeCompare(e.name)),e})(g(i(e,e=>k(t,e)))),r=i(n,t=>"
    • "+t.html+"
    • ").join("");return"

      "+A.translate(["Plugins installed ({0}):",n.length])+"

        "+r+"
      "+(()=>{const t=''+A.translate("Learn more...")+"";return'"})()};var $=tinymce.util.Tools.resolve("tinymce.EditorManager");const E="help";d.add(E,(t,n)=>{const r=(()=>{let t={};return{get:()=>t,set:e=>{t=e}}})(),o=(t=>({addTab:e=>{const n=e.name??p("tab-name"),r=t.get();r[n]=e,t.set(r)}}))(r);(t=>{(0,t.options.register)("help_tabs",{processor:"array"})})(t);const a=((t,n,r)=>()=>{(async(t,n,r)=>{const o=S(),a=await(async t=>({name:"keyboardnav",title:"Keyboard Navigation",items:[{type:"htmlpanel",presets:"document",html:await w(t)}]}))(r),l=(t=>({name:"plugins",title:"Plugins",items:[{type:"htmlpanel",presets:"document",html:null==t?"":"
      "+C(t)+"
      "}]}))(t),u=(()=>{var t,e;const n='TinyMCE '+(t=$.majorVersion,e=$.minorVersion,(0===t.indexOf("@")?"X.X.X":t+"."+e)+"");return{name:"versions",title:"Version",items:[{type:"htmlpanel",html:"

      "+A.translate(["You are using {0}",n])+"

      ",presets:"document"}]}})(),m={[o.name]:o,[a.name]:a,[l.name]:l,[u.name]:u,...n.get()};return s.from(f(t)).fold(()=>(t=>{const e=c(t),n=e.indexOf("versions");return-1!==n&&(e.splice(n,1),e.push("versions")),{tabs:t,names:e}})(m),t=>((t,n)=>{const r={},s=i(t,t=>{if(e(t))return h(n,t)&&(r[t]=n[t]),t;{const e=t.name??p("tab-name");return r[e]=t,e}});return{tabs:r,names:s}})(t,m))})(t,n,r).then(({tabs:e,names:n})=>{const r=i(n,t=>u(e,t)),s={type:"tabpanel",tabs:g(r)};t.windowManager.open({title:"Help",size:"medium",body:s,buttons:[{type:"cancel",name:"close",text:"Close",primary:!0}],initialData:{}})})})(t,r,n);return((t,e)=>{t.ui.registry.addButton("help",{icon:"help",tooltip:"Help",onAction:e,context:"any"}),t.ui.registry.addMenuItem("help",{text:"Help",icon:"help",shortcut:"Alt+0",onAction:e,context:"any"})})(t,a),((t,e)=>{t.addCommand("mceHelp",e)})(t,a),t.shortcuts.add("Alt+0","Open help dialog","mceHelp"),((t,e)=>{t.on("init",()=>{w(e)})})(t,n),{...o,getMetadata:()=>({name:"Help",type:"opensource",slug:E})}})}(); \ No newline at end of file diff --git a/public/assets/tinymce/plugins/image/plugin.js b/public/assets/tinymce/plugins/image/plugin.js index 8dfd04c2e..6166a9588 100644 --- a/public/assets/tinymce/plugins/image/plugin.js +++ b/public/assets/tinymce/plugins/image/plugin.js @@ -1,5 +1,5 @@ /** - * TinyMCE version 8.1.2 (TBD) + * TinyMCE version 8.10.0 (2026-10-14) */ (function () { @@ -10,13 +10,12 @@ /* eslint-disable @typescript-eslint/no-wrapper-object-types */ const getPrototypeOf = Object.getPrototypeOf; const hasProto = (v, constructor, predicate) => { - var _a; if (predicate(v, constructor.prototype)) { return true; } else { // String-based fallback time - return ((_a = v.constructor) === null || _a === void 0 ? void 0 : _a.name) === constructor.name; + return v.constructor?.name === constructor.name; } }; const typeOf = (x) => { @@ -78,6 +77,11 @@ * strict-null-checks */ class Optional { + tag; + value; + // Sneaky optimisation: every instance of Optional.none is identical, so just + // reuse the same object + static singletonNone = new Optional(false); // The internal representation has a `tag` and a `value`, but both are // private: able to be console.logged, but not able to be accessed by code constructor(tag, value) { @@ -245,7 +249,7 @@ */ getOrDie(message) { if (!this.tag) { - throw new Error(message !== null && message !== void 0 ? message : 'Called getOrDie on None'); + throw new Error(message ?? 'Called getOrDie on None'); } else { return this.value; @@ -309,9 +313,6 @@ return this.tag ? `some(${this.value})` : 'none()'; } } - // Sneaky optimisation: every instance of Optional.none is identical, so just - // reuse the same object - Optional.singletonNone = new Optional(false); const nativeSlice = Array.prototype.slice; const nativePush = Array.prototype.push; @@ -461,6 +462,20 @@ element.dom.removeAttribute(key); }; + const getImageSize = (url) => new Promise((resolve, reject) => { + const img = document.createElement('img'); + img.addEventListener('load', () => { + resolve({ + width: img.naturalWidth, + height: img.naturalHeight + }); + }); + img.addEventListener('error', () => { + reject(`Failed to get image dimensions for: ${url}`); + }); + img.src = url; + }); + var global$3 = tinymce.util.Tools.resolve('tinymce.dom.DOMUtils'); var global$2 = tinymce.util.Tools.resolve('tinymce.util.URI'); @@ -521,33 +536,6 @@ const hasUploadUrl = (editor) => isNotEmpty(editor.options.get('images_upload_url')); const hasUploadHandler = (editor) => isNonNullable(editor.options.get('images_upload_handler')); - // TODO: Figure out if these would ever be something other than numbers. This was added in: #TINY-1350 - const parseIntAndGetMax = (val1, val2) => Math.max(parseInt(val1, 10), parseInt(val2, 10)); - const getImageSize = (url) => new Promise((callback) => { - const img = document.createElement('img'); - const done = (dimensions) => { - if (img.parentNode) { - img.parentNode.removeChild(img); - } - callback(dimensions); - }; - img.addEventListener('load', () => { - const width = parseIntAndGetMax(img.width, img.clientWidth); - const height = parseIntAndGetMax(img.height, img.clientHeight); - const dimensions = { width, height }; - done(Promise.resolve(dimensions)); - }); - img.addEventListener('error', () => { - done(Promise.reject(`Failed to get image dimensions for: ${url}`)); - }); - const style = img.style; - style.visibility = 'hidden'; - style.position = 'fixed'; - style.bottom = style.left = '0px'; - style.width = style.height = 'auto'; - document.body.appendChild(img); - img.src = url; - }); const removePixelSuffix = (value) => { if (value) { value = value.replace(/px$/, ''); @@ -637,8 +625,7 @@ resolve(reader.result); }; reader.onerror = () => { - var _a; - reject((_a = reader.error) === null || _a === void 0 ? void 0 : _a.message); + reject(reader.error?.message); }; reader.readAsDataURL(blob); }); @@ -678,9 +665,8 @@ } }; const getAttrib = (image, name) => { - var _a; if (image.hasAttribute(name)) { - return (_a = image.getAttribute(name)) !== null && _a !== void 0 ? _a : ''; + return image.getAttribute(name) ?? ''; } else { return ''; @@ -763,7 +749,7 @@ const setBorderStyle = (image, value) => { image.style.borderStyle = value; }; - const getBorderStyle = (image) => { var _a; return (_a = image.style.borderStyle) !== null && _a !== void 0 ? _a : ''; }; + const getBorderStyle = (image) => image.style.borderStyle ?? ''; const isFigure = (elm) => isNonNullable(elm) && elm.nodeName === 'FIGURE'; const isImage = (elm) => elm.nodeName === 'IMG'; const getIsDecorative = (image) => { @@ -802,7 +788,6 @@ isDecorative: false }); const getStyleValue = (normalizeCss, data) => { - var _a; const image = document.createElement('img'); updateAttrib(image, 'style', data.style); if (getHspace(image) || data.hspace !== '') { @@ -817,7 +802,7 @@ if (getBorderStyle(image) || data.borderStyle !== '') { setBorderStyle(image, data.borderStyle); } - return normalizeCss((_a = image.getAttribute('style')) !== null && _a !== void 0 ? _a : ''); + return normalizeCss(image.getAttribute('style') ?? ''); }; const create = (normalizeCss, data) => { const image = document.createElement('img'); @@ -920,12 +905,11 @@ return imgElm; }; const splitTextBlock = (editor, figure) => { - var _a; const dom = editor.dom; const textBlockElements = filter(editor.schema.getTextBlockElements(), (_, parentElm) => !editor.schema.isValidChild(parentElm, 'figure')); const textBlock = dom.getParent(figure.parentNode, (node) => hasNonNullableKey(textBlockElements, node.nodeName), editor.getBody()); if (textBlock) { - return (_a = dom.split(textBlock, figure)) !== null && _a !== void 0 ? _a : figure; + return dom.split(textBlock, figure) ?? figure; } else { return figure; @@ -1129,6 +1113,9 @@ ]))); }); }); + const alertErr = (message, callback) => { + editor.windowManager.alert(message, callback); + }; const classList = ListUtils.sanitize(getClassList(editor)); const hasAdvTab$1 = hasAdvTab(editor); const hasUploadTab$1 = hasUploadTab(editor); @@ -1143,6 +1130,7 @@ const automaticUploads = isAutomaticUploadsEnabled(editor); const prependURL = Optional.some(getPrependUrl(editor)).filter((preUrl) => isString(preUrl) && preUrl.length > 0); return futureImageList.then((imageList) => ({ + alertErr, image, imageList, classList, @@ -1243,11 +1231,12 @@ makeItems }; - const makeTab = (_info) => { + const makeTab = (_info, onInvalidFiles) => { const items = [ { type: 'dropzone', - name: 'fileinput' + name: 'fileinput', + onInvalidFiles } ]; return { @@ -1454,7 +1443,7 @@ finalize(); }).catch((err) => { finalize(); - helpers.alertErr(err, () => { + info.alertErr(err, () => { api.focus('fileinput'); }); }); @@ -1494,7 +1483,7 @@ tabs: flatten([ [MainTab.makeTab(info)], info.hasAdvTab ? [AdvTab.makeTab(info)] : [], - info.hasUploadTab && (info.hasUploadUrl || info.hasUploadHandler) ? [UploadTab.makeTab(info)] : [] + info.hasUploadTab && (info.hasUploadUrl || info.hasUploadHandler) ? [UploadTab.makeTab(info, () => new Promise((r) => info.alertErr('Selected images do not have allowed extensions', r)))] : [] ]) }; return tabPanel; @@ -1513,6 +1502,7 @@ // Since the style field was removed that process must be simulated on submit. const finalData = { ...data, + isDecorative: info.hasAccessibilityOptions && data.isDecorative, style: getStyleValue(helpers.normalizeCss, toImageData(data, false)) }; editor.execCommand('mceUpdateImage', false, toImageData(finalData, info.hasAccessibilityOptions)); @@ -1532,32 +1522,25 @@ })); } }; - const createBlobCache = (editor) => (file, blobUri, dataUrl) => { - var _a; - return editor.editorUpload.blobCache.create({ - blob: file, - blobUri, - name: (_a = file.name) === null || _a === void 0 ? void 0 : _a.replace(/\.[^\.]+$/, ''), - filename: file.name, - base64: dataUrl.split(',')[1] - }); - }; + const createBlobCache = (editor) => (file, blobUri, dataUrl) => editor.editorUpload.blobCache.create({ + blob: file, + blobUri, + name: file.name?.replace(/\.[^\.]+$/, ''), + filename: file.name, + base64: dataUrl.split(',')[1] + }); const addToBlobCache = (editor) => (blobInfo) => { editor.editorUpload.blobCache.add(blobInfo); }; - const alertErr = (editor) => (message, callback) => { - editor.windowManager.alert(message, callback); - }; const normalizeCss = (editor) => (cssText) => normalizeCss$1(editor, cssText); const parseStyle = (editor) => (cssText) => editor.dom.parseStyle(cssText); const serializeStyle = (editor) => (stylesArg, name) => editor.dom.serializeStyle(stylesArg, name); const uploadImage = (editor) => (blobInfo) => global$1(editor).upload([blobInfo], false).then((results) => { - var _a; if (results.length === 0) { return Promise.reject('Failed to upload image'); } else if (results[0].status === false) { - return Promise.reject((_a = results[0].error) === null || _a === void 0 ? void 0 : _a.message); + return Promise.reject(results[0].error?.message); } else { return results[0]; @@ -1568,7 +1551,6 @@ imageSize: imageSize(editor), addToBlobCache: addToBlobCache(editor), createBlobCache: createBlobCache(editor), - alertErr: alertErr(editor), normalizeCss: normalizeCss(editor), parseStyle: parseStyle(editor), serializeStyle: serializeStyle(editor), @@ -1679,12 +1661,16 @@ }); }; + const PLUGIN_CODE = 'image'; var Plugin = () => { - global$4.add('image', (editor) => { + global$4.add(PLUGIN_CODE, (editor) => { register$2(editor); setup(editor); register(editor); register$1(editor); + return { + getMetadata: () => ({ name: 'Image', type: 'opensource', slug: PLUGIN_CODE }) + }; }); }; diff --git a/public/assets/tinymce/plugins/image/plugin.min.js b/public/assets/tinymce/plugins/image/plugin.min.js index e0b584715..b9890a0ae 100644 --- a/public/assets/tinymce/plugins/image/plugin.min.js +++ b/public/assets/tinymce/plugins/image/plugin.min.js @@ -1 +1 @@ -!function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager");const t=Object.getPrototypeOf,a=(e,t,a)=>{var i;return!!a(e,t.prototype)||(null===(i=e.constructor)||void 0===i?void 0:i.name)===t.name},i=e=>t=>(e=>{const t=typeof e;return null===e?"null":"object"===t&&Array.isArray(e)?"array":"object"===t&&a(e,String,((e,t)=>t.isPrototypeOf(e)))?"string":t})(t)===e,s=e=>t=>typeof t===e,r=i("string"),o=i("object"),n=e=>((e,i)=>o(e)&&a(e,i,((e,a)=>t(e)===a)))(e,Object),l=i("array"),c=e=>null===e;const m=s("boolean"),d=e=>!(e=>null==e)(e),g=s("function"),u=s("number"),p=()=>{};class h{constructor(e,t){this.tag=e,this.value=t}static some(e){return new h(!0,e)}static none(){return h.singletonNone}fold(e,t){return this.tag?t(this.value):e()}isSome(){return this.tag}isNone(){return!this.tag}map(e){return this.tag?h.some(e(this.value)):h.none()}bind(e){return this.tag?e(this.value):h.none()}exists(e){return this.tag&&e(this.value)}forall(e){return!this.tag||e(this.value)}filter(e){return!this.tag||e(this.value)?this:h.none()}getOr(e){return this.tag?this.value:e}or(e){return this.tag?this:e}getOrThunk(e){return this.tag?this.value:e()}orThunk(e){return this.tag?this:e()}getOrDie(e){if(this.tag)return this.value;throw new Error(null!=e?e:"Called getOrDie on None")}static from(e){return d(e)?h.some(e):h.none()}getOrNull(){return this.tag?this.value:null}getOrUndefined(){return this.value}each(e){this.tag&&e(this.value)}toArray(){return this.tag?[this.value]:[]}toString(){return this.tag?`some(${this.value})`:"none()"}}h.singletonNone=new h(!1),Array.prototype.slice;const b=Array.prototype.push,v=e=>{const t=[];for(let a=0,i=e.length;af.call(e,t),w=(D=(e,t)=>n(e)&&n(t)?w(e,t):t,(...e)=>{if(0===e.length)throw new Error("Can't merge zero objects");const t={};for(let a=0;ae.length>0,C=e=>{if(null==e)throw new Error("Node cannot be null or undefined");return{dom:e}},I=C,U=(e,t,a)=>{((e,t,a)=>{if(!(r(a)||m(a)||u(a)))throw console.error("Invalid call to Attribute.set. Key ",t,":: Value ",a,":: Element ",e),new Error("Attribute value was not simple");e.setAttribute(t,a+"")})(e.dom,t,a)};var S=tinymce.util.Tools.resolve("tinymce.dom.DOMUtils"),x=tinymce.util.Tools.resolve("tinymce.util.URI");const N=e=>t=>t.options.get(e),T=N("image_dimensions"),E=N("image_advtab"),L=N("image_uploadtab"),O=N("image_prepend_url"),j=N("image_class_list"),M=N("image_description"),R=N("image_title"),k=N("image_caption"),z=N("image_list"),B=N("a11y_advanced_options"),P=N("automatic_uploads"),H=(e,t)=>Math.max(parseInt(e,10),parseInt(t,10)),F=e=>(e&&(e=e.replace(/px$/,"")),e),G=e=>(e.length>0&&/^[0-9]+$/.test(e)&&(e+="px"),e),W=e=>"IMG"===e.nodeName&&(e.hasAttribute("data-mce-object")||e.hasAttribute("data-mce-placeholder")),$=(e,t)=>{const a=e.options.get;return x.isDomSafe(t,"img",{allow_html_data_urls:a("allow_html_data_urls"),allow_script_urls:a("allow_script_urls"),allow_svg_data_urls:a("allow_svg_data_urls")})},V=S.DOM,K=e=>e.style.marginLeft&&e.style.marginRight&&e.style.marginLeft===e.style.marginRight?F(e.style.marginLeft):"",Z=e=>e.style.marginTop&&e.style.marginBottom&&e.style.marginTop===e.style.marginBottom?F(e.style.marginTop):"",q=e=>e.style.borderWidth?F(e.style.borderWidth):"",J=(e,t)=>{var a;return e.hasAttribute(t)&&null!==(a=e.getAttribute(t))&&void 0!==a?a:""},Q=e=>null!==e.parentNode&&"FIGURE"===e.parentNode.nodeName,X=(e,t,a)=>{""===a||null===a?e.removeAttribute(t):e.setAttribute(t,a)},Y=(e,t)=>{const a=e.getAttribute("style"),i=t(null!==a?a:"");i.length>0?(e.setAttribute("style",i),e.setAttribute("data-mce-style",i)):e.removeAttribute("style")},ee=(e,t)=>(e,a,i)=>{const s=e.style;s[a]?(s[a]=G(i),Y(e,t)):X(e,a,i)},te=(e,t)=>e.style[t]?F(e.style[t]):J(e,t),ae=(e,t)=>{const a=G(t);e.style.marginLeft=a,e.style.marginRight=a},ie=(e,t)=>{const a=G(t);e.style.marginTop=a,e.style.marginBottom=a},se=(e,t)=>{const a=G(t);e.style.borderWidth=a},re=(e,t)=>{e.style.borderStyle=t},oe=e=>{var t;return null!==(t=e.style.borderStyle)&&void 0!==t?t:""},ne=e=>d(e)&&"FIGURE"===e.nodeName,le=e=>{const t=V.getAttrib(e,"alt"),a=V.getAttrib(e,"role");return e.hasAttribute("alt")&&0===t.length||"presentation"===a||"none"===a},ce=e=>le(e)?"":J(e,"alt"),me=(e,t)=>{var a;const i=document.createElement("img");return X(i,"style",t.style),(K(i)||""!==t.hspace)&&ae(i,t.hspace),(Z(i)||""!==t.vspace)&&ie(i,t.vspace),(q(i)||""!==t.border)&&se(i,t.border),(oe(i)||""!==t.borderStyle)&&re(i,t.borderStyle),e(null!==(a=i.getAttribute("style"))&&void 0!==a?a:"")},de=(e,t)=>({src:J(t,"src"),alt:ce(t),title:J(t,"title"),width:te(t,"width"),height:te(t,"height"),class:J(t,"class"),style:e(J(t,"style")),caption:Q(t),hspace:K(t),vspace:Z(t),border:q(t),borderStyle:oe(t),isDecorative:le(t)}),ge=(e,t,a,i,s)=>{a[i]!==t[i]&&s(e,i,String(a[i]))},ue=(e,t,a)=>{if(a){V.setAttrib(e,"role","presentation");const t=I(e);U(t,"alt","")}else{if(c(t)){I(e).dom.removeAttribute("alt")}else{const a=I(e);U(a,"alt",t)}"presentation"===V.getAttrib(e,"role")&&V.setAttrib(e,"role","")}},pe=(e,t)=>(a,i,s)=>{e(a,s),Y(a,t)},he=(e,t,a)=>{const i=de(e,a);ge(a,i,t,"caption",((e,t,a)=>(e=>{Q(e)?(e=>{const t=e.parentNode;d(t)&&(V.insertAfter(e,t),V.remove(t))})(e):(e=>{const t=V.create("figure",{class:"image"});V.insertAfter(t,e),t.appendChild(e),t.appendChild(V.create("figcaption",{contentEditable:"true"},"Caption")),t.contentEditable="false"})(e)})(e))),ge(a,i,t,"src",X),ge(a,i,t,"title",X),ge(a,i,t,"width",ee(0,e)),ge(a,i,t,"height",ee(0,e)),ge(a,i,t,"class",X),ge(a,i,t,"style",pe(((e,t)=>X(e,"style",t)),e)),ge(a,i,t,"hspace",pe(ae,e)),ge(a,i,t,"vspace",pe(ie,e)),ge(a,i,t,"border",pe(se,e)),ge(a,i,t,"borderStyle",pe(re,e)),((e,t,a)=>{a.alt===t.alt&&a.isDecorative===t.isDecorative||ue(e,a.alt,a.isDecorative)})(a,i,t)},be=(e,t)=>{const a=(e=>{if(e.margin){const t=String(e.margin).split(" ");switch(t.length){case 1:e["margin-top"]=e["margin-top"]||t[0],e["margin-right"]=e["margin-right"]||t[0],e["margin-bottom"]=e["margin-bottom"]||t[0],e["margin-left"]=e["margin-left"]||t[0];break;case 2:e["margin-top"]=e["margin-top"]||t[0],e["margin-right"]=e["margin-right"]||t[1],e["margin-bottom"]=e["margin-bottom"]||t[0],e["margin-left"]=e["margin-left"]||t[1];break;case 3:e["margin-top"]=e["margin-top"]||t[0],e["margin-right"]=e["margin-right"]||t[1],e["margin-bottom"]=e["margin-bottom"]||t[2],e["margin-left"]=e["margin-left"]||t[1];break;case 4:e["margin-top"]=e["margin-top"]||t[0],e["margin-right"]=e["margin-right"]||t[1],e["margin-bottom"]=e["margin-bottom"]||t[2],e["margin-left"]=e["margin-left"]||t[3]}delete e.margin}return e})(e.dom.styles.parse(t)),i=e.dom.styles.parse(e.dom.styles.serialize(a));return e.dom.styles.serialize(i)},ve=e=>{const t=e.selection.getNode(),a=e.dom.getParent(t,"figure.image");return a?e.dom.select("img",a)[0]:t&&("IMG"!==t.nodeName||W(t))?null:t},ye=(e,t)=>{var a;const i=e.dom,s=(t=>{const a={};var i;return((e,t,a,i)=>{((e,t)=>{const a=y(e);for(let i=0,s=a.length;i{(t(e,s)?a:i)(e,s)}))})(t,((t,a)=>!e.schema.isValidChild(a,"figure")),(i=a,(e,t)=>{i[t]=e}),p),a})(e.schema.getTextBlockElements()),r=i.getParent(t.parentNode,(e=>{return t=s,a=e.nodeName,A(t,a)&&void 0!==t[a]&&null!==t[a];var t,a}),e.getBody());return r&&null!==(a=i.split(r,t))&&void 0!==a?a:t},fe=(e,t)=>{const a=((t,a)=>{const i=document.createElement("img");if(he((t=>be(e,t)),{...a,caption:!1},i),ue(i,a.alt,a.isDecorative),a.caption){const e=V.create("figure",{class:"image"});return e.appendChild(i),e.appendChild(V.create("figcaption",{contentEditable:"true"},"Caption")),e.contentEditable="false",e}return i})(0,t);e.dom.setAttrib(a,"data-mce-id","__mcenew"),e.focus(),e.insertContent(a.outerHTML);const i=e.dom.select('*[data-mce-id="__mcenew"]')[0];if(e.dom.setAttrib(i,"data-mce-id",null),ne(i)){const t=ye(e,i);e.selection.select(t)}else e.selection.select(i)},Ae=(e,t)=>{const a=ve(e);if(a){const i={...de((t=>be(e,t)),a),...t},s=((e,t)=>{const a=t.src;return{...t,src:$(e,a)?a:""}})(e,i);i.src?((e,t)=>{const a=ve(e);if(a)if(he((t=>be(e,t)),t,a),((e,t)=>{e.dom.setAttrib(t,"src",t.getAttribute("src"))})(e,a),ne(a.parentNode)){e.dom.setStyle(a,"float","");const t=a.parentNode;ye(e,t),e.selection.select(a.parentNode)}else e.selection.select(a),((e,t,a)=>{const i=()=>{a.onload=a.onerror=null,e.selection&&(e.selection.select(a),e.nodeChanged())};a.onload=()=>{t.width||t.height||!T(e)||e.dom.setAttribs(a,{width:String(a.clientWidth),height:String(a.clientHeight)}),i()},a.onerror=i})(e,t,a)})(e,s):((e,t)=>{if(t){const a=e.dom.is(t.parentNode,"figure.image")?t.parentNode:t;e.dom.remove(a),e.focus(),e.nodeChanged(),e.dom.isEmpty(e.getBody())&&(e.setContent(""),e.selection.setCursorLocation())}})(e,a)}else t.src&&fe(e,{src:"",alt:"",title:"",width:"",height:"",class:"",style:"",caption:!1,hspace:"",vspace:"",border:"",borderStyle:"",isDecorative:!1,...t})};var we=tinymce.util.Tools.resolve("tinymce.util.ImageUploader"),De=tinymce.util.Tools.resolve("tinymce.util.Tools");const _e=e=>r(e.value)?e.value:"",Ce=(e,t)=>{const a=[];return De.each(e,(e=>{const i=(e=>r(e.text)?e.text:r(e.title)?e.title:"")(e);if(void 0!==e.menu){const s=Ce(e.menu,t);a.push({text:i,items:s})}else{const s=t(e);a.push({text:i,value:s})}})),a},Ie=(e=_e)=>t=>t?h.from(t).map((t=>Ce(t,e))):h.none(),Ue=(e,t)=>(e=>{for(let i=0;iA(e,"items"))(a=e[i])?Ue(a.items,t):a.value===t?h.some(a):h.none();if(s.isSome())return s}var a;return h.none()})(e),Se=Ie,xe=(e,t)=>e.bind((e=>Ue(e,t))),Ne=e=>{const t=Se((t=>e.convertURL(t.value||t.url||"","src"))),a=new Promise((a=>{((e,t)=>{const a=z(e);r(a)?fetch(a).then((e=>{e.ok&&e.json().then(t)})):g(a)?a(t):t(a)})(e,(e=>{a(t(e).map((e=>v([[{text:"None",value:""}],e]))))}))})),i=(w=j(e),Ie(_e)(w)),s=E(e),o=L(e),n=(e=>_(e.options.get("images_upload_url")))(e),l=(e=>d(e.options.get("images_upload_handler")))(e),c=(e=>{const t=ve(e);return t?de((t=>be(e,t)),t):{src:"",alt:"",title:"",width:"",height:"",class:"",style:"",caption:!1,hspace:"",vspace:"",border:"",borderStyle:"",isDecorative:!1}})(e),m=M(e),u=R(e),p=T(e),b=k(e),y=B(e),f=P(e),A=h.some(O(e)).filter((e=>r(e)&&e.length>0));var w;return a.then((e=>({image:c,imageList:e,classList:i,hasAdvTab:s,hasUploadTab:o,hasUploadUrl:n,hasUploadHandler:l,hasDescription:m,hasImageTitle:u,hasDimensions:p,hasImageCaption:b,prependURL:A,hasAccessibilityOptions:y,automaticUploads:f})))},Te=e=>{const t=e.imageList.map((e=>({name:"images",type:"listbox",label:"Image list",items:e}))),a={name:"alt",type:"input",label:"Alternative description",enabled:!(e.hasAccessibilityOptions&&e.image.isDecorative)},i=e.classList.map((e=>({name:"classes",type:"listbox",label:"Class",items:e})));return v([[{name:"src",type:"urlinput",filetype:"image",label:"Source",picker_text:"Browse files"}],t.toArray(),e.hasAccessibilityOptions&&e.hasDescription?[{type:"label",label:"Accessibility",items:[{name:"isDecorative",type:"checkbox",label:"Image is decorative"}]}]:[],e.hasDescription?[a]:[],e.hasImageTitle?[{name:"title",type:"input",label:"Image title"}]:[],e.hasDimensions?[{name:"dimensions",type:"sizeinput"}]:[],[{...(s=e.classList.isSome()&&e.hasImageCaption,s?{type:"grid",columns:2}:{type:"panel"}),items:v([i.toArray(),e.hasImageCaption?[{type:"label",label:"Caption",items:[{type:"checkbox",name:"caption",label:"Show caption"}]}]:[]])}]]);var s},Ee=e=>({title:"General",name:"general",items:Te(e)}),Le=Te,Oe=e=>({src:{value:e.src,meta:{}},images:e.src,alt:e.alt,title:e.title,dimensions:{width:e.width,height:e.height},classes:e.class,caption:e.caption,style:e.style,vspace:e.vspace,border:e.border,hspace:e.hspace,borderstyle:e.borderStyle,fileinput:[],isDecorative:e.isDecorative}),je=(e,t)=>({src:e.src.value,alt:null!==e.alt&&0!==e.alt.length||!t?e.alt:null,title:e.title,width:e.dimensions.width,height:e.dimensions.height,class:e.classes,style:e.style,caption:e.caption,hspace:e.hspace,vspace:e.vspace,border:e.border,borderStyle:e.borderstyle,isDecorative:e.isDecorative}),Me=(e,t,a,i)=>{((e,t)=>{const a=t.getData();((e,t)=>/^(?:[a-zA-Z]+:)?\/\//.test(t)?h.none():e.prependURL.bind((e=>t.substring(0,e.length)!==e?h.some(e+t):h.none())))(e,a.src.value).each((e=>{t.setData({src:{value:e,meta:a.src.meta}})}))})(t,i),((e,t)=>{const a=t.getData(),i=a.src.meta;if(void 0!==i){const s=w({},a);((e,t,a)=>{e.hasDescription&&r(a.alt)&&(t.alt=a.alt),e.hasAccessibilityOptions&&(t.isDecorative=a.isDecorative||t.isDecorative||!1),e.hasImageTitle&&r(a.title)&&(t.title=a.title),e.hasDimensions&&(r(a.width)&&(t.dimensions.width=a.width),r(a.height)&&(t.dimensions.height=a.height)),r(a.class)&&xe(e.classList,a.class).each((e=>{t.classes=e.value})),e.hasImageCaption&&m(a.caption)&&(t.caption=a.caption),e.hasAdvTab&&(r(a.style)&&(t.style=a.style),r(a.vspace)&&(t.vspace=a.vspace),r(a.border)&&(t.border=a.border),r(a.hspace)&&(t.hspace=a.hspace),r(a.borderstyle)&&(t.borderstyle=a.borderstyle))})(e,s,i),t.setData(s)}})(t,i),((e,t,a,i)=>{const s=i.getData(),r=s.src.value,o=s.src.meta||{};o.width||o.height||!t.hasDimensions||(_(r)?e.imageSize(r).then((e=>{a.open&&i.setData({dimensions:e})})).catch((e=>console.error(e))):i.setData({dimensions:{width:"",height:""}}))})(e,t,a,i),((e,t,a)=>{const i=a.getData(),s=xe(e.imageList,i.src.value);t.prevImage=s,a.setData({images:s.map((e=>e.value)).getOr("")})})(t,a,i)},Re=(e,t,a,i)=>{const s=i.getData();var r;i.block("Uploading image"),(r=s.fileinput,(e=>0{i.unblock()}),(s=>{const r=URL.createObjectURL(s),o=()=>{i.unblock(),URL.revokeObjectURL(r)},n=s=>{i.setData({src:{value:s,meta:{}}}),i.showTab("general"),Me(e,t,a,i),i.focus("src")};var l;(l=s,new Promise(((e,t)=>{const a=new FileReader;a.onload=()=>{e(a.result)},a.onerror=()=>{var e;t(null===(e=a.error)||void 0===e?void 0:e.message)},a.readAsDataURL(l)}))).then((a=>{const l=e.createBlobCache(s,r,a);t.automaticUploads?e.uploadImage(l).then((e=>{n(e.url),o()})).catch((t=>{o(),e.alertErr(t,(()=>{i.focus("fileinput")}))})):(e.addToBlobCache(l),n(l.blobUri()),i.unblock())}))}))},ke=(e,t,a)=>(i,s)=>{"src"===s.name?Me(e,t,a,i):"images"===s.name?((e,t,a,i)=>{const s=i.getData(),r=xe(t.imageList,s.images);r.each((e=>{const t=""===s.alt||a.prevImage.map((e=>e.text===s.alt)).getOr(!1);t?""===e.value?i.setData({src:e,alt:a.prevAlt}):i.setData({src:e,alt:e.text}):i.setData({src:e})})),a.prevImage=r,Me(e,t,a,i)})(e,t,a,i):"alt"===s.name?a.prevAlt=i.getData().alt:"fileinput"===s.name?Re(e,t,a,i):"isDecorative"===s.name&&i.setEnabled("alt",!i.getData().isDecorative)},ze=e=>()=>{e.open=!1},Be=e=>e.hasAdvTab||e.hasUploadUrl||e.hasUploadHandler?{type:"tabpanel",tabs:v([[Ee(e)],e.hasAdvTab?[{title:"Advanced",name:"advanced",items:[{type:"grid",columns:2,items:[{type:"input",label:"Vertical space",name:"vspace",inputMode:"numeric"},{type:"input",label:"Horizontal space",name:"hspace",inputMode:"numeric"},{type:"input",label:"Border width",name:"border",inputMode:"numeric"},{type:"listbox",name:"borderstyle",label:"Border style",items:[{text:"Select...",value:""},{text:"Solid",value:"solid"},{text:"Dotted",value:"dotted"},{text:"Dashed",value:"dashed"},{text:"Double",value:"double"},{text:"Groove",value:"groove"},{text:"Ridge",value:"ridge"},{text:"Inset",value:"inset"},{text:"Outset",value:"outset"},{text:"None",value:"none"},{text:"Hidden",value:"hidden"}]}]}]}]:[],e.hasUploadTab&&(e.hasUploadUrl||e.hasUploadHandler)?[{title:"Upload",name:"upload",items:[{type:"dropzone",name:"fileinput"}]}]:[]])}:{type:"panel",items:Le(e)},Pe=(e,t,a)=>i=>{const s=w(Oe(t.image),i.getData()),r={...s,style:me(a.normalizeCss,je(s,!1))};e.execCommand("mceUpdateImage",!1,je(r,t.hasAccessibilityOptions)),e.editorUpload.uploadImagesAuto(),i.close()},He=e=>t=>$(e,t)?(e=>new Promise((t=>{const a=document.createElement("img"),i=e=>{a.parentNode&&a.parentNode.removeChild(a),t(e)};a.addEventListener("load",(()=>{const e={width:H(a.width,a.clientWidth),height:H(a.height,a.clientHeight)};i(Promise.resolve(e))})),a.addEventListener("error",(()=>{i(Promise.reject(`Failed to get image dimensions for: ${e}`))}));const s=a.style;s.visibility="hidden",s.position="fixed",s.bottom=s.left="0px",s.width=s.height="auto",document.body.appendChild(a),a.src=e})))(e.documentBaseURI.toAbsolute(t)).then((e=>({width:String(e.width),height:String(e.height)}))):Promise.resolve({width:"",height:""}),Fe=e=>(t,a,i)=>{var s;return e.editorUpload.blobCache.create({blob:t,blobUri:a,name:null===(s=t.name)||void 0===s?void 0:s.replace(/\.[^\.]+$/,""),filename:t.name,base64:i.split(",")[1]})},Ge=e=>t=>{e.editorUpload.blobCache.add(t)},We=e=>(t,a)=>{e.windowManager.alert(t,a)},$e=e=>t=>be(e,t),Ve=e=>t=>e.dom.parseStyle(t),Ke=e=>(t,a)=>e.dom.serializeStyle(t,a),Ze=e=>t=>we(e).upload([t],!1).then((e=>{var t;return 0===e.length?Promise.reject("Failed to upload image"):!1===e[0].status?Promise.reject(null===(t=e[0].error)||void 0===t?void 0:t.message):e[0]})),qe=e=>{const t={imageSize:He(e),addToBlobCache:Ge(e),createBlobCache:Fe(e),alertErr:We(e),normalizeCss:$e(e),parseStyle:Ve(e),serializeStyle:Ke(e),uploadImage:Ze(e)};return{open:()=>{Ne(e).then((a=>{const i=(e=>({prevImage:xe(e.imageList,e.image.src),prevAlt:e.image.alt,open:!0}))(a);return{title:"Insert/Edit Image",size:"normal",body:Be(a),buttons:[{type:"cancel",name:"cancel",text:"Cancel"},{type:"submit",name:"save",text:"Save",primary:!0}],initialData:Oe(a.image),onSubmit:Pe(e,a,t),onChange:ke(t,a,i),onClose:ze(i)}})).then(e.windowManager.open)}}},Je=e=>{const t=e.attr("class");return d(t)&&/\bimage\b/.test(t)},Qe=e=>t=>{let a=t.length;const i=t=>{t.attr("contenteditable",e?"true":null)};for(;a--;){const s=t[a];Je(s)&&(s.attr("contenteditable",e?"false":null),De.each(s.getAll("figcaption"),i))}},Xe=e=>t=>{const a=()=>{t.setEnabled(e.selection.isEditable())};return e.on("NodeChange",a),a(),()=>{e.off("NodeChange",a)}};e.add("image",(e=>{(e=>{const t=e.options.register;t("image_dimensions",{processor:"boolean",default:!0}),t("image_advtab",{processor:"boolean",default:!1}),t("image_uploadtab",{processor:"boolean",default:!0}),t("image_prepend_url",{processor:"string",default:""}),t("image_class_list",{processor:"object[]"}),t("image_description",{processor:"boolean",default:!0}),t("image_title",{processor:"boolean",default:!1}),t("image_caption",{processor:"boolean",default:!1}),t("image_list",{processor:e=>{const t=!1===e||r(e)||((e,t)=>{if(l(e)){for(let a=0,i=e.length;a{e.on("PreInit",(()=>{e.parser.addNodeFilter("figure",Qe(!0)),e.serializer.addNodeFilter("figure",Qe(!1))}))})(e),(e=>{e.ui.registry.addToggleButton("image",{icon:"image",tooltip:"Insert/edit image",onAction:qe(e).open,onSetup:t=>{t.setActive(d(ve(e)));const a=e.selection.selectorChangedWithUnbind("img:not([data-mce-object]):not([data-mce-placeholder]),figure.image",t.setActive).unbind,i=Xe(e)(t);return()=>{a(),i()}}}),e.ui.registry.addMenuItem("image",{icon:"image",text:"Image...",onAction:qe(e).open,onSetup:Xe(e)}),e.ui.registry.addContextMenu("image",{update:t=>e.selection.isEditable()&&(ne(t)||"IMG"===t.nodeName&&!W(t))?["image"]:[]})})(e),(e=>{e.addCommand("mceImage",qe(e).open),e.addCommand("mceUpdateImage",((t,a)=>{e.undoManager.transact((()=>Ae(e,a)))}))})(e)}))}(); \ No newline at end of file +!function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager");const t=Object.getPrototypeOf,a=(e,t,a)=>!!a(e,t.prototype)||e.constructor?.name===t.name,i=e=>t=>(e=>{const t=typeof e;return null===e?"null":"object"===t&&Array.isArray(e)?"array":"object"===t&&a(e,String,(e,t)=>t.isPrototypeOf(e))?"string":t})(t)===e,s=e=>t=>typeof t===e,r=i("string"),o=i("object"),n=e=>((e,i)=>o(e)&&a(e,i,(e,a)=>t(e)===a))(e,Object),l=i("array"),c=e=>null===e;const m=s("boolean"),d=e=>!(e=>null==e)(e),g=s("function"),u=s("number"),p=()=>{};class h{tag;value;static singletonNone=new h(!1);constructor(e,t){this.tag=e,this.value=t}static some(e){return new h(!0,e)}static none(){return h.singletonNone}fold(e,t){return this.tag?t(this.value):e()}isSome(){return this.tag}isNone(){return!this.tag}map(e){return this.tag?h.some(e(this.value)):h.none()}bind(e){return this.tag?e(this.value):h.none()}exists(e){return this.tag&&e(this.value)}forall(e){return!this.tag||e(this.value)}filter(e){return!this.tag||e(this.value)?this:h.none()}getOr(e){return this.tag?this.value:e}or(e){return this.tag?this:e}getOrThunk(e){return this.tag?this.value:e()}orThunk(e){return this.tag?this:e()}getOrDie(e){if(this.tag)return this.value;throw new Error(e??"Called getOrDie on None")}static from(e){return d(e)?h.some(e):h.none()}getOrNull(){return this.tag?this.value:null}getOrUndefined(){return this.value}each(e){this.tag&&e(this.value)}toArray(){return this.tag?[this.value]:[]}toString(){return this.tag?`some(${this.value})`:"none()"}}Array.prototype.slice;const b=Array.prototype.push,y=e=>{const t=[];for(let a=0,i=e.length;af.call(e,t),w=(D=(e,t)=>n(e)&&n(t)?w(e,t):t,(...e)=>{if(0===e.length)throw new Error("Can't merge zero objects");const t={};for(let a=0;ae.length>0,C=e=>{if(null==e)throw new Error("Node cannot be null or undefined");return{dom:e}},I=C,S=(e,t,a)=>{((e,t,a)=>{if(!(r(a)||m(a)||u(a)))throw console.error("Invalid call to Attribute.set. Key ",t,":: Value ",a,":: Element ",e),new Error("Attribute value was not simple");e.setAttribute(t,a+"")})(e.dom,t,a)};var U=tinymce.util.Tools.resolve("tinymce.dom.DOMUtils"),x=tinymce.util.Tools.resolve("tinymce.util.URI");const N=e=>t=>t.options.get(e),E=N("image_dimensions"),T=N("image_advtab"),O=N("image_uploadtab"),L=N("image_prepend_url"),M=N("image_class_list"),R=N("image_description"),j=N("image_title"),k=N("image_caption"),z=N("image_list"),B=N("a11y_advanced_options"),P=N("automatic_uploads"),F=e=>(e&&(e=e.replace(/px$/,"")),e),H=e=>(e.length>0&&/^[0-9]+$/.test(e)&&(e+="px"),e),G=e=>"IMG"===e.nodeName&&(e.hasAttribute("data-mce-object")||e.hasAttribute("data-mce-placeholder")),W=(e,t)=>{const a=e.options.get;return x.isDomSafe(t,"img",{allow_html_data_urls:a("allow_html_data_urls"),allow_script_urls:a("allow_script_urls"),allow_svg_data_urls:a("allow_svg_data_urls")})},$=U.DOM,V=e=>e.style.marginLeft&&e.style.marginRight&&e.style.marginLeft===e.style.marginRight?F(e.style.marginLeft):"",K=e=>e.style.marginTop&&e.style.marginBottom&&e.style.marginTop===e.style.marginBottom?F(e.style.marginTop):"",Z=e=>e.style.borderWidth?F(e.style.borderWidth):"",q=(e,t)=>e.hasAttribute(t)?e.getAttribute(t)??"":"",J=e=>null!==e.parentNode&&"FIGURE"===e.parentNode.nodeName,Q=(e,t,a)=>{""===a||null===a?e.removeAttribute(t):e.setAttribute(t,a)},X=(e,t)=>{const a=e.getAttribute("style"),i=t(null!==a?a:"");i.length>0?(e.setAttribute("style",i),e.setAttribute("data-mce-style",i)):e.removeAttribute("style")},Y=(e,t)=>(e,a,i)=>{const s=e.style;s[a]?(s[a]=H(i),X(e,t)):Q(e,a,i)},ee=(e,t)=>e.style[t]?F(e.style[t]):q(e,t),te=(e,t)=>{const a=H(t);e.style.marginLeft=a,e.style.marginRight=a},ae=(e,t)=>{const a=H(t);e.style.marginTop=a,e.style.marginBottom=a},ie=(e,t)=>{const a=H(t);e.style.borderWidth=a},se=(e,t)=>{e.style.borderStyle=t},re=e=>e.style.borderStyle??"",oe=e=>d(e)&&"FIGURE"===e.nodeName,ne=e=>{const t=$.getAttrib(e,"alt"),a=$.getAttrib(e,"role");return e.hasAttribute("alt")&&0===t.length||"presentation"===a||"none"===a},le=e=>ne(e)?"":q(e,"alt"),ce=(e,t)=>{const a=document.createElement("img");return Q(a,"style",t.style),(V(a)||""!==t.hspace)&&te(a,t.hspace),(K(a)||""!==t.vspace)&&ae(a,t.vspace),(Z(a)||""!==t.border)&&ie(a,t.border),(re(a)||""!==t.borderStyle)&&se(a,t.borderStyle),e(a.getAttribute("style")??"")},me=(e,t)=>({src:q(t,"src"),alt:le(t),title:q(t,"title"),width:ee(t,"width"),height:ee(t,"height"),class:q(t,"class"),style:e(q(t,"style")),caption:J(t),hspace:V(t),vspace:K(t),border:Z(t),borderStyle:re(t),isDecorative:ne(t)}),de=(e,t,a,i,s)=>{a[i]!==t[i]&&s(e,i,String(a[i]))},ge=(e,t,a)=>{if(a){$.setAttrib(e,"role","presentation");const t=I(e);S(t,"alt","")}else{if(c(t)){I(e).dom.removeAttribute("alt")}else{const a=I(e);S(a,"alt",t)}"presentation"===$.getAttrib(e,"role")&&$.setAttrib(e,"role","")}},ue=(e,t)=>(a,i,s)=>{e(a,s),X(a,t)},pe=(e,t,a)=>{const i=me(e,a);de(a,i,t,"caption",(e,t,a)=>(e=>{J(e)?(e=>{const t=e.parentNode;d(t)&&($.insertAfter(e,t),$.remove(t))})(e):(e=>{const t=$.create("figure",{class:"image"});$.insertAfter(t,e),t.appendChild(e),t.appendChild($.create("figcaption",{contentEditable:"true"},"Caption")),t.contentEditable="false"})(e)})(e)),de(a,i,t,"src",Q),de(a,i,t,"title",Q),de(a,i,t,"width",Y(0,e)),de(a,i,t,"height",Y(0,e)),de(a,i,t,"class",Q),de(a,i,t,"style",ue((e,t)=>Q(e,"style",t),e)),de(a,i,t,"hspace",ue(te,e)),de(a,i,t,"vspace",ue(ae,e)),de(a,i,t,"border",ue(ie,e)),de(a,i,t,"borderStyle",ue(se,e)),((e,t,a)=>{a.alt===t.alt&&a.isDecorative===t.isDecorative||ge(e,a.alt,a.isDecorative)})(a,i,t)},he=(e,t)=>{const a=(e=>{if(e.margin){const t=String(e.margin).split(" ");switch(t.length){case 1:e["margin-top"]=e["margin-top"]||t[0],e["margin-right"]=e["margin-right"]||t[0],e["margin-bottom"]=e["margin-bottom"]||t[0],e["margin-left"]=e["margin-left"]||t[0];break;case 2:e["margin-top"]=e["margin-top"]||t[0],e["margin-right"]=e["margin-right"]||t[1],e["margin-bottom"]=e["margin-bottom"]||t[0],e["margin-left"]=e["margin-left"]||t[1];break;case 3:e["margin-top"]=e["margin-top"]||t[0],e["margin-right"]=e["margin-right"]||t[1],e["margin-bottom"]=e["margin-bottom"]||t[2],e["margin-left"]=e["margin-left"]||t[1];break;case 4:e["margin-top"]=e["margin-top"]||t[0],e["margin-right"]=e["margin-right"]||t[1],e["margin-bottom"]=e["margin-bottom"]||t[2],e["margin-left"]=e["margin-left"]||t[3]}delete e.margin}return e})(e.dom.styles.parse(t)),i=e.dom.styles.parse(e.dom.styles.serialize(a));return e.dom.styles.serialize(i)},be=e=>{const t=e.selection.getNode(),a=e.dom.getParent(t,"figure.image");return a?e.dom.select("img",a)[0]:t&&("IMG"!==t.nodeName||G(t))?null:t},ye=(e,t)=>{const a=e.dom,i=(t=>{const a={};var i;return((e,t,a,i)=>{((e,t)=>{const a=v(e);for(let i=0,s=a.length;i{(t(e,s)?a:i)(e,s)})})(t,(t,a)=>!e.schema.isValidChild(a,"figure"),(i=a,(e,t)=>{i[t]=e}),p),a})(e.schema.getTextBlockElements()),s=a.getParent(t.parentNode,e=>{return t=i,a=e.nodeName,A(t,a)&&void 0!==t[a]&&null!==t[a];var t,a},e.getBody());return s?a.split(s,t)??t:t},ve=(e,t)=>{const a=((t,a)=>{const i=document.createElement("img");if(pe(t=>he(e,t),{...a,caption:!1},i),ge(i,a.alt,a.isDecorative),a.caption){const e=$.create("figure",{class:"image"});return e.appendChild(i),e.appendChild($.create("figcaption",{contentEditable:"true"},"Caption")),e.contentEditable="false",e}return i})(0,t);e.dom.setAttrib(a,"data-mce-id","__mcenew"),e.focus(),e.insertContent(a.outerHTML);const i=e.dom.select('*[data-mce-id="__mcenew"]')[0];if(e.dom.setAttrib(i,"data-mce-id",null),oe(i)){const t=ye(e,i);e.selection.select(t)}else e.selection.select(i)},fe=(e,t)=>{const a=be(e);if(a){const i={...me(t=>he(e,t),a),...t},s=((e,t)=>{const a=t.src;return{...t,src:W(e,a)?a:""}})(e,i);i.src?((e,t)=>{const a=be(e);if(a)if(pe(t=>he(e,t),t,a),((e,t)=>{e.dom.setAttrib(t,"src",t.getAttribute("src"))})(e,a),oe(a.parentNode)){e.dom.setStyle(a,"float","");const t=a.parentNode;ye(e,t),e.selection.select(a.parentNode)}else e.selection.select(a),((e,t,a)=>{const i=()=>{a.onload=a.onerror=null,e.selection&&(e.selection.select(a),e.nodeChanged())};a.onload=()=>{t.width||t.height||!E(e)||e.dom.setAttribs(a,{width:String(a.clientWidth),height:String(a.clientHeight)}),i()},a.onerror=i})(e,t,a)})(e,s):((e,t)=>{if(t){const a=e.dom.is(t.parentNode,"figure.image")?t.parentNode:t;e.dom.remove(a),e.focus(),e.nodeChanged(),e.dom.isEmpty(e.getBody())&&(e.setContent(""),e.selection.setCursorLocation())}})(e,a)}else t.src&&ve(e,{src:"",alt:"",title:"",width:"",height:"",class:"",style:"",caption:!1,hspace:"",vspace:"",border:"",borderStyle:"",isDecorative:!1,...t})};var Ae=tinymce.util.Tools.resolve("tinymce.util.ImageUploader"),we=tinymce.util.Tools.resolve("tinymce.util.Tools");const De=e=>r(e.value)?e.value:"",_e=(e,t)=>{const a=[];return we.each(e,e=>{const i=(e=>r(e.text)?e.text:r(e.title)?e.title:"")(e);if(void 0!==e.menu){const s=_e(e.menu,t);a.push({text:i,items:s})}else{const s=t(e);a.push({text:i,value:s})}}),a},Ce=(e=De)=>t=>t?h.from(t).map(t=>_e(t,e)):h.none(),Ie=(e,t)=>((e,t)=>{for(let a=0;a(e=>A(e,"items"))(e)?Ie(e.items,t):e.value===t?h.some(e):h.none()),Se=Ce,Ue=(e,t)=>e.bind(e=>Ie(e,t)),xe=e=>{const t=Se(t=>e.convertURL(t.value||t.url||"","src")),a=new Promise(a=>{((e,t)=>{const a=z(e);r(a)?fetch(a).then(e=>{e.ok&&e.json().then(t)}):g(a)?a(t):t(a)})(e,e=>{a(t(e).map(e=>y([[{text:"None",value:""}],e])))})}),i=(t,a)=>{e.windowManager.alert(t,a)},s=(D=M(e),Ce(De)(D)),o=T(e),n=O(e),l=(e=>_(e.options.get("images_upload_url")))(e),c=(e=>d(e.options.get("images_upload_handler")))(e),m=(e=>{const t=be(e);return t?me(t=>he(e,t),t):{src:"",alt:"",title:"",width:"",height:"",class:"",style:"",caption:!1,hspace:"",vspace:"",border:"",borderStyle:"",isDecorative:!1}})(e),u=R(e),p=j(e),b=E(e),v=k(e),f=B(e),A=P(e),w=h.some(L(e)).filter(e=>r(e)&&e.length>0);var D;return a.then(e=>({alertErr:i,image:m,imageList:e,classList:s,hasAdvTab:o,hasUploadTab:n,hasUploadUrl:l,hasUploadHandler:c,hasDescription:u,hasImageTitle:p,hasDimensions:b,hasImageCaption:v,prependURL:w,hasAccessibilityOptions:f,automaticUploads:A}))},Ne=e=>{const t=e.imageList.map(e=>({name:"images",type:"listbox",label:"Image list",items:e})),a={name:"alt",type:"input",label:"Alternative description",enabled:!(e.hasAccessibilityOptions&&e.image.isDecorative)},i=e.classList.map(e=>({name:"classes",type:"listbox",label:"Class",items:e}));return y([[{name:"src",type:"urlinput",filetype:"image",label:"Source",picker_text:"Browse files"}],t.toArray(),e.hasAccessibilityOptions&&e.hasDescription?[{type:"label",label:"Accessibility",items:[{name:"isDecorative",type:"checkbox",label:"Image is decorative"}]}]:[],e.hasDescription?[a]:[],e.hasImageTitle?[{name:"title",type:"input",label:"Image title"}]:[],e.hasDimensions?[{name:"dimensions",type:"sizeinput"}]:[],[{...(s=e.classList.isSome()&&e.hasImageCaption,s?{type:"grid",columns:2}:{type:"panel"}),items:y([i.toArray(),e.hasImageCaption?[{type:"label",label:"Caption",items:[{type:"checkbox",name:"caption",label:"Show caption"}]}]:[]])}]]);var s},Ee=e=>({title:"General",name:"general",items:Ne(e)}),Te=Ne,Oe=e=>({src:{value:e.src,meta:{}},images:e.src,alt:e.alt,title:e.title,dimensions:{width:e.width,height:e.height},classes:e.class,caption:e.caption,style:e.style,vspace:e.vspace,border:e.border,hspace:e.hspace,borderstyle:e.borderStyle,fileinput:[],isDecorative:e.isDecorative}),Le=(e,t)=>({src:e.src.value,alt:null!==e.alt&&0!==e.alt.length||!t?e.alt:null,title:e.title,width:e.dimensions.width,height:e.dimensions.height,class:e.classes,style:e.style,caption:e.caption,hspace:e.hspace,vspace:e.vspace,border:e.border,borderStyle:e.borderstyle,isDecorative:e.isDecorative}),Me=(e,t,a,i)=>{((e,t)=>{const a=t.getData();((e,t)=>/^(?:[a-zA-Z]+:)?\/\//.test(t)?h.none():e.prependURL.bind(e=>t.substring(0,e.length)!==e?h.some(e+t):h.none()))(e,a.src.value).each(e=>{t.setData({src:{value:e,meta:a.src.meta}})})})(t,i),((e,t)=>{const a=t.getData(),i=a.src.meta;if(void 0!==i){const s=w({},a);((e,t,a)=>{e.hasDescription&&r(a.alt)&&(t.alt=a.alt),e.hasAccessibilityOptions&&(t.isDecorative=a.isDecorative||t.isDecorative||!1),e.hasImageTitle&&r(a.title)&&(t.title=a.title),e.hasDimensions&&(r(a.width)&&(t.dimensions.width=a.width),r(a.height)&&(t.dimensions.height=a.height)),r(a.class)&&Ue(e.classList,a.class).each(e=>{t.classes=e.value}),e.hasImageCaption&&m(a.caption)&&(t.caption=a.caption),e.hasAdvTab&&(r(a.style)&&(t.style=a.style),r(a.vspace)&&(t.vspace=a.vspace),r(a.border)&&(t.border=a.border),r(a.hspace)&&(t.hspace=a.hspace),r(a.borderstyle)&&(t.borderstyle=a.borderstyle))})(e,s,i),t.setData(s)}})(t,i),((e,t,a,i)=>{const s=i.getData(),r=s.src.value,o=s.src.meta||{};o.width||o.height||!t.hasDimensions||(_(r)?e.imageSize(r).then(e=>{a.open&&i.setData({dimensions:e})}).catch(e=>console.error(e)):i.setData({dimensions:{width:"",height:""}}))})(e,t,a,i),((e,t,a)=>{const i=a.getData(),s=Ue(e.imageList,i.src.value);t.prevImage=s,a.setData({images:s.map(e=>e.value).getOr("")})})(t,a,i)},Re=(e,t,a,i)=>{const s=i.getData();var r;i.block("Uploading image"),(r=s.fileinput,(e=>0{i.unblock()},s=>{const r=URL.createObjectURL(s),o=()=>{i.unblock(),URL.revokeObjectURL(r)},n=s=>{i.setData({src:{value:s,meta:{}}}),i.showTab("general"),Me(e,t,a,i),i.focus("src")};var l;(l=s,new Promise((e,t)=>{const a=new FileReader;a.onload=()=>{e(a.result)},a.onerror=()=>{t(a.error?.message)},a.readAsDataURL(l)})).then(a=>{const l=e.createBlobCache(s,r,a);t.automaticUploads?e.uploadImage(l).then(e=>{n(e.url),o()}).catch(e=>{o(),t.alertErr(e,()=>{i.focus("fileinput")})}):(e.addToBlobCache(l),n(l.blobUri()),i.unblock())})})},je=(e,t,a)=>(i,s)=>{"src"===s.name?Me(e,t,a,i):"images"===s.name?((e,t,a,i)=>{const s=i.getData(),r=Ue(t.imageList,s.images);r.each(e=>{const t=""===s.alt||a.prevImage.map(e=>e.text===s.alt).getOr(!1);t?""===e.value?i.setData({src:e,alt:a.prevAlt}):i.setData({src:e,alt:e.text}):i.setData({src:e})}),a.prevImage=r,Me(e,t,a,i)})(e,t,a,i):"alt"===s.name?a.prevAlt=i.getData().alt:"fileinput"===s.name?Re(e,t,a,i):"isDecorative"===s.name&&i.setEnabled("alt",!i.getData().isDecorative)},ke=e=>()=>{e.open=!1},ze=e=>{return e.hasAdvTab||e.hasUploadUrl||e.hasUploadHandler?{type:"tabpanel",tabs:y([[Ee(e)],e.hasAdvTab?[{title:"Advanced",name:"advanced",items:[{type:"grid",columns:2,items:[{type:"input",label:"Vertical space",name:"vspace",inputMode:"numeric"},{type:"input",label:"Horizontal space",name:"hspace",inputMode:"numeric"},{type:"input",label:"Border width",name:"border",inputMode:"numeric"},{type:"listbox",name:"borderstyle",label:"Border style",items:[{text:"Select...",value:""},{text:"Solid",value:"solid"},{text:"Dotted",value:"dotted"},{text:"Dashed",value:"dashed"},{text:"Double",value:"double"},{text:"Groove",value:"groove"},{text:"Ridge",value:"ridge"},{text:"Inset",value:"inset"},{text:"Outset",value:"outset"},{text:"None",value:"none"},{text:"Hidden",value:"hidden"}]}]}]}]:[],e.hasUploadTab&&(e.hasUploadUrl||e.hasUploadHandler)?[(t=()=>new Promise(t=>e.alertErr("Selected images do not have allowed extensions",t)),{title:"Upload",name:"upload",items:[{type:"dropzone",name:"fileinput",onInvalidFiles:t}]})]:[]])}:{type:"panel",items:Te(e)};var t},Be=(e,t,a)=>i=>{const s=w(Oe(t.image),i.getData()),r={...s,isDecorative:t.hasAccessibilityOptions&&s.isDecorative,style:ce(a.normalizeCss,Le(s,!1))};e.execCommand("mceUpdateImage",!1,Le(r,t.hasAccessibilityOptions)),e.editorUpload.uploadImagesAuto(),i.close()},Pe=e=>t=>W(e,t)?(e=>new Promise((t,a)=>{const i=document.createElement("img");i.addEventListener("load",()=>{t({width:i.naturalWidth,height:i.naturalHeight})}),i.addEventListener("error",()=>{a(`Failed to get image dimensions for: ${e}`)}),i.src=e}))(e.documentBaseURI.toAbsolute(t)).then(e=>({width:String(e.width),height:String(e.height)})):Promise.resolve({width:"",height:""}),Fe=e=>(t,a,i)=>e.editorUpload.blobCache.create({blob:t,blobUri:a,name:t.name?.replace(/\.[^\.]+$/,""),filename:t.name,base64:i.split(",")[1]}),He=e=>t=>{e.editorUpload.blobCache.add(t)},Ge=e=>t=>he(e,t),We=e=>t=>e.dom.parseStyle(t),$e=e=>(t,a)=>e.dom.serializeStyle(t,a),Ve=e=>t=>Ae(e).upload([t],!1).then(e=>0===e.length?Promise.reject("Failed to upload image"):!1===e[0].status?Promise.reject(e[0].error?.message):e[0]),Ke=e=>{const t={imageSize:Pe(e),addToBlobCache:He(e),createBlobCache:Fe(e),normalizeCss:Ge(e),parseStyle:We(e),serializeStyle:$e(e),uploadImage:Ve(e)};return{open:()=>{xe(e).then(a=>{const i=(e=>({prevImage:Ue(e.imageList,e.image.src),prevAlt:e.image.alt,open:!0}))(a);return{title:"Insert/Edit Image",size:"normal",body:ze(a),buttons:[{type:"cancel",name:"cancel",text:"Cancel"},{type:"submit",name:"save",text:"Save",primary:!0}],initialData:Oe(a.image),onSubmit:Be(e,a,t),onChange:je(t,a,i),onClose:ke(i)}}).then(e.windowManager.open)}}},Ze=e=>{const t=e.attr("class");return d(t)&&/\bimage\b/.test(t)},qe=e=>t=>{let a=t.length;const i=t=>{t.attr("contenteditable",e?"true":null)};for(;a--;){const s=t[a];Ze(s)&&(s.attr("contenteditable",e?"false":null),we.each(s.getAll("figcaption"),i))}},Je=e=>t=>{const a=()=>{t.setEnabled(e.selection.isEditable())};return e.on("NodeChange",a),a(),()=>{e.off("NodeChange",a)}},Qe="image";e.add(Qe,e=>((e=>{const t=e.options.register;t("image_dimensions",{processor:"boolean",default:!0}),t("image_advtab",{processor:"boolean",default:!1}),t("image_uploadtab",{processor:"boolean",default:!0}),t("image_prepend_url",{processor:"string",default:""}),t("image_class_list",{processor:"object[]"}),t("image_description",{processor:"boolean",default:!0}),t("image_title",{processor:"boolean",default:!1}),t("image_caption",{processor:"boolean",default:!1}),t("image_list",{processor:e=>{const t=!1===e||r(e)||((e,t)=>{if(l(e)){for(let a=0,i=e.length;a{e.on("PreInit",()=>{e.parser.addNodeFilter("figure",qe(!0)),e.serializer.addNodeFilter("figure",qe(!1))})})(e),(e=>{e.ui.registry.addToggleButton("image",{icon:"image",tooltip:"Insert/edit image",onAction:Ke(e).open,onSetup:t=>{t.setActive(d(be(e)));const a=e.selection.selectorChangedWithUnbind("img:not([data-mce-object]):not([data-mce-placeholder]),figure.image",t.setActive).unbind,i=Je(e)(t);return()=>{a(),i()}}}),e.ui.registry.addMenuItem("image",{icon:"image",text:"Image...",onAction:Ke(e).open,onSetup:Je(e)}),e.ui.registry.addContextMenu("image",{update:t=>e.selection.isEditable()&&(oe(t)||"IMG"===t.nodeName&&!G(t))?["image"]:[]})})(e),(e=>{e.addCommand("mceImage",Ke(e).open),e.addCommand("mceUpdateImage",(t,a)=>{e.undoManager.transact(()=>fe(e,a))})})(e),{getMetadata:()=>({name:"Image",type:"opensource",slug:Qe})}))}(); \ No newline at end of file diff --git a/public/assets/tinymce/plugins/importcss/plugin.js b/public/assets/tinymce/plugins/importcss/plugin.js index 23fc4a07c..d04f9217a 100644 --- a/public/assets/tinymce/plugins/importcss/plugin.js +++ b/public/assets/tinymce/plugins/importcss/plugin.js @@ -1,5 +1,5 @@ /** - * TinyMCE version 8.1.2 (TBD) + * TinyMCE version 8.10.0 (2026-10-14) */ (function () { @@ -9,13 +9,12 @@ /* eslint-disable @typescript-eslint/no-wrapper-object-types */ const hasProto = (v, constructor, predicate) => { - var _a; if (predicate(v, constructor.prototype)) { return true; } else { // String-based fallback time - return ((_a = v.constructor) === null || _a === void 0 ? void 0 : _a.name) === constructor.name; + return v.constructor?.name === constructor.name; } }; const typeOf = (x) => { @@ -202,7 +201,7 @@ try { rules = styleSheet.cssRules || styleSheet.rules; } - catch (_a) { + catch { // Firefox fails on rules to remote domain for example: // @import url(//fonts.googleapis.com/css?family=Pathway+Gothic+One); } @@ -230,7 +229,7 @@ append(styleSheet); }); } - catch (_a) { + catch { // Ignore } return selectors; @@ -384,11 +383,15 @@ }; }; + const PLUGIN_CODE = 'importcss'; var Plugin = () => { - global$4.add('importcss', (editor) => { + global$4.add(PLUGIN_CODE, (editor) => { register(editor); setup(editor); - return get(editor); + return { + ...get(editor), + getMetadata: () => ({ name: 'Import CSS', type: 'opensource', slug: PLUGIN_CODE }) + }; }); }; diff --git a/public/assets/tinymce/plugins/importcss/plugin.min.js b/public/assets/tinymce/plugins/importcss/plugin.min.js index 7afed5cfd..49cd604db 100644 --- a/public/assets/tinymce/plugins/importcss/plugin.min.js +++ b/public/assets/tinymce/plugins/importcss/plugin.min.js @@ -1 +1 @@ -!function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager");const t=e=>t=>(e=>{const t=typeof e;return null===e?"null":"object"===t&&Array.isArray(e)?"array":"object"===t&&(s=r=e,(o=String).prototype.isPrototypeOf(s)||(null===(n=r.constructor)||void 0===n?void 0:n.name)===o.name)?"string":t;var s,r,o,n})(t)===e,s=t("string"),r=t("object"),o=t("array"),n=e=>"function"==typeof e;Array.prototype.slice;const c=Array.prototype.push;n(Array.from)&&Array.from;var i=tinymce.util.Tools.resolve("tinymce.dom.DOMUtils"),l=tinymce.util.Tools.resolve("tinymce.EditorManager"),a=tinymce.util.Tools.resolve("tinymce.Env"),p=tinymce.util.Tools.resolve("tinymce.util.Tools");const u=e=>t=>t.options.get(e),m=u("importcss_merge_classes"),f=u("importcss_exclusive"),y=u("importcss_selector_converter"),d=u("importcss_selector_filter"),h=u("importcss_groups"),g=u("importcss_append"),_=u("importcss_file_filter"),v=u("skin"),b=u("skin_url"),x=/^\.(?:ephox|tiny-pageembed|mce)(?:[.-]+\w+)+$/,T=e=>s(e)?t=>-1!==t.indexOf(e):e instanceof RegExp?t=>e.test(t):e,S=(e,t)=>{let s={};const r=/^(?:([a-z0-9\-_]+))?(\.[a-z0-9_\-\.]+)$/i.exec(t);if(!r)return;const o=r[1],n=r[2].substr(1).split(".").join(" "),c=p.makeMap("a,img");return r[1]?(s={title:t},e.schema.getTextBlockElements()[o]?s.block=o:e.schema.getBlockElements()[o]||c[o.toLowerCase()]?s.selector=o:s.inline=o):r[2]&&(s={inline:"span",title:t.substr(1),classes:n}),m(e)?s.classes=n:s.attributes={class:n},s},A=(e,t)=>null===t||f(e),k=e=>{e.on("init",(()=>{const t=(()=>{const e=[],t=[],s={};return{addItemToGroup:(e,r)=>{s[e]?s[e].push(r):(t.push(e),s[e]=[r])},addItem:t=>{e.push(t)},toFormats:()=>{return(r=t,n=e=>{const t=s[e];return 0===t.length?[]:[{title:e,items:t}]},(e=>{const t=[];for(let s=0,r=e.length;s{const s=e.length,r=new Array(s);for(let o=0;op.map(e,(e=>p.extend({},e,{original:e,selectors:{},filter:T(e.filter)}))))(h(e)),m=(t,s)=>{if(((e,t,s,r)=>!(A(e,s)?t in r:t in s.selectors))(e,t,s,r)){((e,t,s,r)=>{A(e,s)?r[t]=!0:s.selectors[t]=!0})(e,t,s,r);const o=((e,t,s,r)=>{let o;const n=y(e);return o=r&&r.selector_converter?r.selector_converter:n||(()=>S(e,s)),o.call(t,s,r)})(e,e.plugins.importcss,t,s);if(o){const t=o.name||i.DOM.uniqueId();return e.formatter.register(t,o),{title:o.title,format:t}}}return null};p.each(((e,t,r)=>{const o=[],n={},c=(t,n)=>{let i,u=t.href;if(u=(e=>{const t=a.cacheSuffix;return s(e)&&(e=e.replace("?"+t,"").replace("&"+t,"")),e})(u),u&&(!r||r(u,n))&&!((e,t)=>{const s=v(e);if(s){const r=b(e),o=r?e.documentBaseURI.toAbsolute(r):l.baseURL+"/skins/ui/"+s,n=l.baseURL+"/skins/content/",c=e.editorManager.suffix;return t===o+"/content"+(e.inline?".inline":"")+`${c}.css`||-1!==t.indexOf(n)}return!1})(e,u)){p.each(t.imports,(e=>{c(e,!0)}));try{i=t.cssRules||t.rules}catch(e){}p.each(i,(e=>{e.styleSheet&&e.styleSheet?c(e.styleSheet,!0):e.selectorText&&p.each(e.selectorText.split(","),(e=>{o.push(p.trim(e))}))}))}};p.each(e.contentCSS,(e=>{n[e]=!0})),r||(r=(e,t)=>t||n[e]);try{p.each(t.styleSheets,(e=>{c(e)}))}catch(e){}return o})(e,e.getDoc(),T(_(e))),(e=>{if(!x.test(e)&&(!n||n(e))){const s=((e,t)=>p.grep(e,(e=>!e.filter||e.filter(t))))(u,e);if(s.length>0)p.each(s,(s=>{const r=m(e,s);r&&t.addItemToGroup(s.title,r)}));else{const s=m(e,null);s&&t.addItem(s)}}}));const f=t.toFormats();e.dispatch("addStyleModifications",{items:f,replace:!g(e)})}))};e.add("importcss",(e=>((e=>{const t=e.options.register,o=e=>s(e)||n(e)||r(e);t("importcss_merge_classes",{processor:"boolean",default:!0}),t("importcss_exclusive",{processor:"boolean",default:!0}),t("importcss_selector_converter",{processor:"function"}),t("importcss_selector_filter",{processor:o}),t("importcss_file_filter",{processor:o}),t("importcss_groups",{processor:"object[]"}),t("importcss_append",{processor:"boolean",default:!1})})(e),k(e),(e=>({convertSelectorToFormat:t=>S(e,t)}))(e))))}(); \ No newline at end of file +!function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager");const t=e=>t=>(e=>{const t=typeof e;return null===e?"null":"object"===t&&Array.isArray(e)?"array":"object"===t&&(s=r=e,(o=String).prototype.isPrototypeOf(s)||r.constructor?.name===o.name)?"string":t;var s,r,o})(t)===e,s=t("string"),r=t("object"),o=t("array"),n=e=>"function"==typeof e;Array.prototype.slice;const c=Array.prototype.push;n(Array.from)&&Array.from;var i=tinymce.util.Tools.resolve("tinymce.dom.DOMUtils"),l=tinymce.util.Tools.resolve("tinymce.EditorManager"),a=tinymce.util.Tools.resolve("tinymce.Env"),p=tinymce.util.Tools.resolve("tinymce.util.Tools");const u=e=>t=>t.options.get(e),m=u("importcss_merge_classes"),f=u("importcss_exclusive"),y=u("importcss_selector_converter"),d=u("importcss_selector_filter"),g=u("importcss_groups"),h=u("importcss_append"),_=u("importcss_file_filter"),v=u("skin"),b=u("skin_url"),x=/^\.(?:ephox|tiny-pageembed|mce)(?:[.-]+\w+)+$/,S=e=>s(e)?t=>-1!==t.indexOf(e):e instanceof RegExp?t=>e.test(t):e,T=(e,t)=>{let s={};const r=/^(?:([a-z0-9\-_]+))?(\.[a-z0-9_\-\.]+)$/i.exec(t);if(!r)return;const o=r[1],n=r[2].substr(1).split(".").join(" "),c=p.makeMap("a,img");return r[1]?(s={title:t},e.schema.getTextBlockElements()[o]?s.block=o:e.schema.getBlockElements()[o]||c[o.toLowerCase()]?s.selector=o:s.inline=o):r[2]&&(s={inline:"span",title:t.substr(1),classes:n}),m(e)?s.classes=n:s.attributes={class:n},s},A=(e,t)=>null===t||f(e),k=e=>{e.on("init",()=>{const t=(()=>{const e=[],t=[],s={};return{addItemToGroup:(e,r)=>{s[e]?s[e].push(r):(t.push(e),s[e]=[r])},addItem:t=>{e.push(t)},toFormats:()=>{return(r=t,n=e=>{const t=s[e];return 0===t.length?[]:[{title:e,items:t}]},(e=>{const t=[];for(let s=0,r=e.length;s{const s=e.length,r=new Array(s);for(let o=0;op.map(e,e=>p.extend({},e,{original:e,selectors:{},filter:S(e.filter)})))(g(e)),m=(t,s)=>{if(((e,t,s,r)=>!(A(e,s)?t in r:t in s.selectors))(e,t,s,r)){((e,t,s,r)=>{A(e,s)?r[t]=!0:s.selectors[t]=!0})(e,t,s,r);const o=((e,t,s,r)=>{let o;const n=y(e);return o=r&&r.selector_converter?r.selector_converter:n||(()=>T(e,s)),o.call(t,s,r)})(e,e.plugins.importcss,t,s);if(o){const t=o.name||i.DOM.uniqueId();return e.formatter.register(t,o),{title:o.title,format:t}}}return null};p.each(((e,t,r)=>{const o=[],n={},c=(t,n)=>{let i,u=t.href;if(u=(e=>{const t=a.cacheSuffix;return s(e)&&(e=e.replace("?"+t,"").replace("&"+t,"")),e})(u),u&&(!r||r(u,n))&&!((e,t)=>{const s=v(e);if(s){const r=b(e),o=r?e.documentBaseURI.toAbsolute(r):l.baseURL+"/skins/ui/"+s,n=l.baseURL+"/skins/content/",c=e.editorManager.suffix;return t===o+"/content"+(e.inline?".inline":"")+`${c}.css`||-1!==t.indexOf(n)}return!1})(e,u)){p.each(t.imports,e=>{c(e,!0)});try{i=t.cssRules||t.rules}catch{}p.each(i,e=>{e.styleSheet&&e.styleSheet?c(e.styleSheet,!0):e.selectorText&&p.each(e.selectorText.split(","),e=>{o.push(p.trim(e))})})}};p.each(e.contentCSS,e=>{n[e]=!0}),r||(r=(e,t)=>t||n[e]);try{p.each(t.styleSheets,e=>{c(e)})}catch{}return o})(e,e.getDoc(),S(_(e))),e=>{if(!x.test(e)&&(!n||n(e))){const s=((e,t)=>p.grep(e,e=>!e.filter||e.filter(t)))(u,e);if(s.length>0)p.each(s,s=>{const r=m(e,s);r&&t.addItemToGroup(s.title,r)});else{const s=m(e,null);s&&t.addItem(s)}}});const f=t.toFormats();e.dispatch("addStyleModifications",{items:f,replace:!h(e)})})},M=e=>({convertSelectorToFormat:t=>T(e,t)}),I="importcss";e.add(I,e=>((e=>{const t=e.options.register,o=e=>s(e)||n(e)||r(e);t("importcss_merge_classes",{processor:"boolean",default:!0}),t("importcss_exclusive",{processor:"boolean",default:!0}),t("importcss_selector_converter",{processor:"function"}),t("importcss_selector_filter",{processor:o}),t("importcss_file_filter",{processor:o}),t("importcss_groups",{processor:"object[]"}),t("importcss_append",{processor:"boolean",default:!1})})(e),k(e),{...M(e),getMetadata:()=>({name:"Import CSS",type:"opensource",slug:I})}))}(); \ No newline at end of file diff --git a/public/assets/tinymce/plugins/insertdatetime/plugin.js b/public/assets/tinymce/plugins/insertdatetime/plugin.js index 57a227a90..5f372ec7c 100644 --- a/public/assets/tinymce/plugins/insertdatetime/plugin.js +++ b/public/assets/tinymce/plugins/insertdatetime/plugin.js @@ -1,5 +1,5 @@ /** - * TinyMCE version 8.1.2 (TBD) + * TinyMCE version 8.10.0 (2026-10-14) */ (function () { @@ -99,10 +99,10 @@ const register$1 = (editor) => { editor.addCommand('mceInsertDate', (_ui, value) => { - insertDateTime(editor, value !== null && value !== void 0 ? value : getDateFormat(editor)); + insertDateTime(editor, value ?? getDateFormat(editor)); }); editor.addCommand('mceInsertTime', (_ui, value) => { - insertDateTime(editor, value !== null && value !== void 0 ? value : getTimeFormat(editor)); + insertDateTime(editor, value ?? getTimeFormat(editor)); }); }; @@ -169,11 +169,15 @@ }); }; + const PLUGIN_CODE = 'insertdatetime'; var Plugin = () => { - global$1.add('insertdatetime', (editor) => { + global$1.add(PLUGIN_CODE, (editor) => { register$2(editor); register$1(editor); register(editor); + return { + getMetadata: () => ({ name: 'Insert Date/Time', type: 'opensource', slug: PLUGIN_CODE }) + }; }); }; diff --git a/public/assets/tinymce/plugins/insertdatetime/plugin.min.js b/public/assets/tinymce/plugins/insertdatetime/plugin.min.js index 778e5e634..2c6294380 100644 --- a/public/assets/tinymce/plugins/insertdatetime/plugin.min.js +++ b/public/assets/tinymce/plugins/insertdatetime/plugin.min.js @@ -1 +1 @@ -!function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager");const t=e=>t=>t.options.get(e),n=t("insertdatetime_dateformat"),a=t("insertdatetime_timeformat"),r=t("insertdatetime_formats"),s=t("insertdatetime_element"),i="Sun Mon Tue Wed Thu Fri Sat Sun".split(" "),o="Sunday Monday Tuesday Wednesday Thursday Friday Saturday Sunday".split(" "),l="Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split(" "),m="January February March April May June July August September October November December".split(" "),c=(e,t)=>{if((e=""+e).length(t=(t=(t=(t=(t=(t=(t=(t=(t=(t=(t=(t=(t=(t=(t=t.replace("%D","%m/%d/%Y")).replace("%r","%I:%M:%S %p")).replace("%Y",""+n.getFullYear())).replace("%y",""+n.getYear())).replace("%m",c(n.getMonth()+1,2))).replace("%d",c(n.getDate(),2))).replace("%H",""+c(n.getHours(),2))).replace("%M",""+c(n.getMinutes(),2))).replace("%S",""+c(n.getSeconds(),2))).replace("%I",""+((n.getHours()+11)%12+1))).replace("%p",n.getHours()<12?"AM":"PM")).replace("%B",""+e.translate(m[n.getMonth()]))).replace("%b",""+e.translate(l[n.getMonth()]))).replace("%A",""+e.translate(o[n.getDay()]))).replace("%a",""+e.translate(i[n.getDay()]))).replace("%%","%"),u=(e,t)=>{if(s(e)&&e.selection.isEditable()){const n=d(e,t);let a;a=/%[HMSIp]/.test(t)?d(e,"%Y-%m-%dT%H:%M"):d(e,"%Y-%m-%d");const r=e.dom.getParent(e.selection.getStart(),"time");r?((e,t,n,a)=>{const r=e.dom.create("time",{datetime:n},a);e.dom.replace(r,t),e.selection.select(r,!0),e.selection.collapse(!1)})(e,r,a,n):e.insertContent('")}else e.insertContent(d(e,t))};var p=tinymce.util.Tools.resolve("tinymce.util.Tools");const g=e=>t=>{const n=()=>{t.setEnabled(e.selection.isEditable())};return e.on("NodeChange",n),n(),()=>{e.off("NodeChange",n)}};e.add("insertdatetime",(e=>{(e=>{const t=e.options.register;t("insertdatetime_dateformat",{processor:"string",default:e.translate("%Y-%m-%d")}),t("insertdatetime_timeformat",{processor:"string",default:e.translate("%H:%M:%S")}),t("insertdatetime_formats",{processor:"string[]",default:["%H:%M:%S","%Y-%m-%d","%I:%M:%S %p","%D"]}),t("insertdatetime_element",{processor:"boolean",default:!1})})(e),(e=>{e.addCommand("mceInsertDate",((t,a)=>{u(e,null!=a?a:n(e))})),e.addCommand("mceInsertTime",((t,n)=>{u(e,null!=n?n:a(e))}))})(e),(e=>{const t=r(e),n=(e=>{let t=e;return{get:()=>t,set:e=>{t=e}}})((e=>{const t=r(e);return t.length>0?t[0]:a(e)})(e)),s=t=>e.execCommand("mceInsertDate",!1,t);e.ui.registry.addSplitButton("insertdatetime",{icon:"insert-time",tooltip:"Insert date/time",chevronTooltip:"Insert date/time menu",select:e=>e===n.get(),fetch:n=>{n(p.map(t,(t=>({type:"choiceitem",text:d(e,t),value:t}))))},onAction:e=>{s(n.get())},onItemAction:(e,t)=>{n.set(t),s(t)},onSetup:g(e)});const i=e=>()=>{n.set(e),s(e)};e.ui.registry.addNestedMenuItem("insertdatetime",{icon:"insert-time",text:"Date/time",getSubmenuItems:()=>p.map(t,(t=>({type:"menuitem",text:d(e,t),onAction:i(t)}))),onSetup:g(e)})})(e)}))}(); \ No newline at end of file +!function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager");const t=e=>t=>t.options.get(e),a=t("insertdatetime_dateformat"),n=t("insertdatetime_timeformat"),r=t("insertdatetime_formats"),s=t("insertdatetime_element"),i="Sun Mon Tue Wed Thu Fri Sat Sun".split(" "),o="Sunday Monday Tuesday Wednesday Thursday Friday Saturday Sunday".split(" "),l="Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split(" "),m="January February March April May June July August September October November December".split(" "),c=(e,t)=>{if((e=""+e).length(t=(t=(t=(t=(t=(t=(t=(t=(t=(t=(t=(t=(t=(t=(t=t.replace("%D","%m/%d/%Y")).replace("%r","%I:%M:%S %p")).replace("%Y",""+a.getFullYear())).replace("%y",""+a.getYear())).replace("%m",c(a.getMonth()+1,2))).replace("%d",c(a.getDate(),2))).replace("%H",""+c(a.getHours(),2))).replace("%M",""+c(a.getMinutes(),2))).replace("%S",""+c(a.getSeconds(),2))).replace("%I",""+((a.getHours()+11)%12+1))).replace("%p",a.getHours()<12?"AM":"PM")).replace("%B",""+e.translate(m[a.getMonth()]))).replace("%b",""+e.translate(l[a.getMonth()]))).replace("%A",""+e.translate(o[a.getDay()]))).replace("%a",""+e.translate(i[a.getDay()]))).replace("%%","%"),u=(e,t)=>{if(s(e)&&e.selection.isEditable()){const a=d(e,t);let n;n=/%[HMSIp]/.test(t)?d(e,"%Y-%m-%dT%H:%M"):d(e,"%Y-%m-%d");const r=e.dom.getParent(e.selection.getStart(),"time");r?((e,t,a,n)=>{const r=e.dom.create("time",{datetime:a},n);e.dom.replace(r,t),e.selection.select(r,!0),e.selection.collapse(!1)})(e,r,n,a):e.insertContent('")}else e.insertContent(d(e,t))};var p=tinymce.util.Tools.resolve("tinymce.util.Tools");const g=e=>t=>{const a=()=>{t.setEnabled(e.selection.isEditable())};return e.on("NodeChange",a),a(),()=>{e.off("NodeChange",a)}},y="insertdatetime";e.add(y,e=>((e=>{const t=e.options.register;t("insertdatetime_dateformat",{processor:"string",default:e.translate("%Y-%m-%d")}),t("insertdatetime_timeformat",{processor:"string",default:e.translate("%H:%M:%S")}),t("insertdatetime_formats",{processor:"string[]",default:["%H:%M:%S","%Y-%m-%d","%I:%M:%S %p","%D"]}),t("insertdatetime_element",{processor:"boolean",default:!1})})(e),(e=>{e.addCommand("mceInsertDate",(t,n)=>{u(e,n??a(e))}),e.addCommand("mceInsertTime",(t,a)=>{u(e,a??n(e))})})(e),(e=>{const t=r(e),a=(e=>{let t=e;return{get:()=>t,set:e=>{t=e}}})((e=>{const t=r(e);return t.length>0?t[0]:n(e)})(e)),s=t=>e.execCommand("mceInsertDate",!1,t);e.ui.registry.addSplitButton("insertdatetime",{icon:"insert-time",tooltip:"Insert date/time",chevronTooltip:"Insert date/time menu",select:e=>e===a.get(),fetch:a=>{a(p.map(t,t=>({type:"choiceitem",text:d(e,t),value:t})))},onAction:e=>{s(a.get())},onItemAction:(e,t)=>{a.set(t),s(t)},onSetup:g(e)});const i=e=>()=>{a.set(e),s(e)};e.ui.registry.addNestedMenuItem("insertdatetime",{icon:"insert-time",text:"Date/time",getSubmenuItems:()=>p.map(t,t=>({type:"menuitem",text:d(e,t),onAction:i(t)})),onSetup:g(e)})})(e),{getMetadata:()=>({name:"Insert Date/Time",type:"opensource",slug:y})}))}(); \ No newline at end of file diff --git a/public/assets/tinymce/plugins/link/plugin.js b/public/assets/tinymce/plugins/link/plugin.js index 24674513a..43cc7602c 100644 --- a/public/assets/tinymce/plugins/link/plugin.js +++ b/public/assets/tinymce/plugins/link/plugin.js @@ -1,5 +1,5 @@ /** - * TinyMCE version 8.1.2 (TBD) + * TinyMCE version 8.10.0 (2026-10-14) */ (function () { @@ -9,13 +9,12 @@ /* eslint-disable @typescript-eslint/no-wrapper-object-types */ const hasProto = (v, constructor, predicate) => { - var _a; if (predicate(v, constructor.prototype)) { return true; } else { // String-based fallback time - return ((_a = v.constructor) === null || _a === void 0 ? void 0 : _a.name) === constructor.name; + return v.constructor?.name === constructor.name; } }; const typeOf = (x) => { @@ -62,6 +61,9 @@ return value; }; }; + const identity = (x) => { + return x; + }; const tripleEquals = (a, b) => { return a === b; }; @@ -82,6 +84,11 @@ * strict-null-checks */ class Optional { + tag; + value; + // Sneaky optimisation: every instance of Optional.none is identical, so just + // reuse the same object + static singletonNone = new Optional(false); // The internal representation has a `tag` and a `value`, but both are // private: able to be console.logged, but not able to be accessed by code constructor(tag, value) { @@ -249,7 +256,7 @@ */ getOrDie(message) { if (!this.tag) { - throw new Error(message !== null && message !== void 0 ? message : 'Called getOrDie on None'); + throw new Error(message ?? 'Called getOrDie on None'); } else { return this.value; @@ -313,9 +320,6 @@ return this.tag ? `some(${this.value})` : 'none()'; } } - // Sneaky optimisation: every instance of Optional.none is identical, so just - // reuse the same object - Optional.singletonNone = new Optional(false); const nativeSlice = Array.prototype.slice; const nativeIndexOf = Array.prototype.indexOf; @@ -364,6 +368,8 @@ return r; }; const bind = (xs, f) => flatten(map(xs, f)); + const get = (xs, i) => i >= 0 && i < xs.length ? Optional.some(xs[i]) : Optional.none(); + const head = (xs) => get(xs, 0); isFunction(Array.from) ? Array.from : (x) => nativeSlice.call(x); const findMap = (arr, f) => { for (let i = 0; i < arr.length; i++) { @@ -546,6 +552,13 @@ registerOption('link_attributes_postprocess', { processor: 'function', }); + registerOption('files_upload_handler', { + processor: 'function' + }); + registerOption('link_uploadtab', { + processor: 'boolean', + default: true + }); }; const assumeExternalTargets = option('link_assume_external_targets'); const hasContextToolbar = option('link_context_toolbar'); @@ -559,6 +572,11 @@ const allowUnsafeLinkTarget = option('allow_unsafe_link_target'); const useQuickLink = option('link_quicklink'); const attributesPostProcess = option('link_attributes_postprocess'); + const getFilesUploadHandler = option('files_upload_handler'); + const hasLinkUploadtab = option('link_uploadtab'); + const getDocumentsFileTypes = option('documents_file_types'); + const hasFilesUploadHandler = (editor) => isNonNullable(editor.options.get('files_upload_handler')); + const hasDocumentsFileTypes = (editor) => isNonNullable(editor.options.get('documents_file_types')); var global$4 = tinymce.util.Tools.resolve('tinymce.util.URI'); @@ -588,9 +606,8 @@ }; const hasProtocol = (url) => /^\w+:/i.test(url); const getHref = (elm) => { - var _a, _b; // Returns the real href value not the resolved a.href value - return (_b = (_a = elm.getAttribute('data-mce-href')) !== null && _a !== void 0 ? _a : elm.getAttribute('href')) !== null && _b !== void 0 ? _b : ''; + return elm.getAttribute('data-mce-href') ?? elm.getAttribute('href') ?? ''; }; const applyRelTargetRules = (rel, isUnsafe) => { const rules = ['noopener']; @@ -644,6 +661,16 @@ } }; const isImageFigure = (elm) => isNonNullable(elm) && elm.nodeName === 'FIGURE' && /\bimage\b/i.test(elm.className); + const blobToDataUri = (blob) => new Promise((resolve, reject) => { + const reader = new FileReader(); + reader.onload = () => { + resolve(reader.result); + }; + reader.onerror = () => { + reject(new Error(reader.error?.message ?? 'Failed to convert blob to a data url')); + }; + reader.readAsDataURL(blob); + }); const getLinkAttrs = (data) => { const attrs = ['title', 'rel', 'class', 'target']; @@ -735,8 +762,8 @@ }; const unlinkSelection = (editor) => { const dom = editor.dom, selection = editor.selection; - const bookmark = selection.getBookmark(); const rng = selection.getRng().cloneRange(); + const bookmark = selection.getBookmark(); // Extend the selection out to the entire anchor element const startAnchorElm = dom.getParent(rng.startContainer, 'a[href]', editor.getBody()); const endAnchorElm = dom.getParent(rng.endContainer, 'a[href]', editor.getBody()); @@ -801,22 +828,20 @@ editor.hasPlugin('rtc', true) ? editor.execCommand('unlink') : unlinkDomMutation(editor); }; const unlinkImageFigure = (editor, fig) => { - var _a; const img = editor.dom.select('img', fig)[0]; if (img) { const a = editor.dom.getParents(img, 'a[href]', fig)[0]; if (a) { - (_a = a.parentNode) === null || _a === void 0 ? void 0 : _a.insertBefore(img, a); + a.parentNode?.insertBefore(img, a); editor.dom.remove(a); } } }; const linkImageFigure = (dom, fig, attrs) => { - var _a; const img = dom.select('img', fig)[0]; if (img) { const a = dom.create('a', attrs); - (_a = img.parentNode) === null || _a === void 0 ? void 0 : _a.insertBefore(a, img); + img.parentNode?.insertBefore(a, img); a.appendChild(img); } }; @@ -903,8 +928,8 @@ text: initialData.text, title: initialData.title }; - const getTitleFromUrlChange = (url) => { var _a; return someIf(persistentData.title.length <= 0, Optional.from((_a = url.meta) === null || _a === void 0 ? void 0 : _a.title).getOr('')); }; - const getTextFromUrlChange = (url) => { var _a; return someIf(persistentData.text.length <= 0, Optional.from((_a = url.meta) === null || _a === void 0 ? void 0 : _a.text).getOr(url.value)); }; + const getTitleFromUrlChange = (url) => someIf(persistentData.title.length <= 0, Optional.from(url.meta?.title).getOr('')); + const getTextFromUrlChange = (url) => someIf(persistentData.text.length <= 0, Optional.from(url.meta?.text).getOr(url.value)); const onUrlChange = (data) => { const text = getTextFromUrlChange(data.url); const title = getTitleFromUrlChange(data.url); @@ -1018,7 +1043,7 @@ try { return Optional.some(JSON.parse(text)); } - catch (_a) { + catch { return Optional.none(); } }; @@ -1110,6 +1135,7 @@ }; }; const collect = (editor, linkNode) => LinkListOptions.getLinks(editor).then((links) => { + const hasUploadPanel = hasFilesUploadHandler(editor) && hasDocumentsFileTypes(editor) && hasLinkUploadtab(editor); const anchor = extractFromAnchor(editor, linkNode); return { anchor, @@ -1121,6 +1147,7 @@ anchor: AnchorListOptions.getAnchors(editor), link: links }, + hasUploadPanel, optNode: linkNode, flags: { titleEnabled: shouldShowLinkTitle(editor) @@ -1131,6 +1158,28 @@ collect }; + const makeTab = (fileTypes, onInvalidFiles) => { + const items = [ + { + type: 'dropzone', + name: 'fileinput', + buttonLabel: 'Browse for a file', + dropAreaLabel: 'Drop a file here', + allowedFileTypes: fileTypes.map((e) => e.mimeType).join(','), + allowedFileExtensions: flatten(fileTypes.map((e) => e.extensions)), + onInvalidFiles + } + ]; + return { + title: 'Upload', + name: 'upload', + items + }; + }; + const UploadTab = { + makeTab + }; + const handleSubmit = (editor, info) => (api) => { const data = api.getData(); if (!data.url.value) { @@ -1160,6 +1209,61 @@ }); api.close(); }; + const uploadFile = (editor) => (blobInfo, progress) => { + const fileUploadHandler = getFilesUploadHandler(editor); + return fileUploadHandler(blobInfo, progress); + }; + const dataUrlToBase64 = (dataUrl) => Optional.from(dataUrl.split(',')[1]).getOr(''); + const changeFileInput = (helpers, api) => { + const data = api.getData(); + api.block('Uploading file'); + head(data.fileinput) + .fold(() => { + api.unblock(); + }, (file) => { + const blobUri = URL.createObjectURL(file); + const updateUrlAndSwitchTab = ({ url, fileName }) => { + api.setData({ text: fileName, title: fileName, url: { value: url, meta: {} } }); + api.showTab('general'); + api.focus('url'); + }; + const finalize = () => { + api.unblock(); + URL.revokeObjectURL(blobUri); + }; + blobToDataUri(file).then((dataUrl) => { + const existingBlobInfo = helpers.getExistingBlobInfo(dataUrlToBase64(dataUrl), file.type); + const blobInfo = existingBlobInfo && existingBlobInfo.filename() === file.name ? existingBlobInfo : helpers.createBlobCache(file, blobUri, dataUrl); + helpers.addToBlobCache(blobInfo); + return helpers.uploadFile(blobInfo, identity); + }).then((result) => { + updateUrlAndSwitchTab(result); + finalize(); + }).catch((err) => { + finalize(); + helpers.alertErr(err, () => { + api.focus('fileinput'); + }); + }); + }); + }; + const createBlobCache = (editor) => (file, blobUri, dataUrl) => editor.editorUpload.blobCache.create({ + blob: file, + blobUri, + name: file.name?.replace(/\.[^\.]+$/, ''), + filename: file.name, + base64: dataUrl.split(',')[1], + allowEmptyFile: true + }); + const addToBlobCache = (editor) => (blobInfo) => { + editor.editorUpload.blobCache.add(blobInfo); + }; + const getExistingBlobInfo = (editor) => (base64, type) => { + return editor.editorUpload.blobCache.getByData(base64, type); + }; + const alertErr = (editor) => (message, callback) => { + editor.windowManager.alert(message, callback); + }; const collectData = (editor) => { const anchorNode = getAnchorElement(editor); return DialogInfo.collect(editor, anchorNode); @@ -1182,9 +1286,44 @@ link: url, rel: anchor.rel.getOr(''), target: anchor.target.or(defaultTarget).getOr(''), - linkClass: anchor.linkClass.getOr('') + linkClass: anchor.linkClass.getOr(''), + fileinput: [] }; }; + const makeDialogBody = (urlInput, displayText, titleText, catalogs, hasUploadPanel, fileTypes, onInvalidFiles) => { + const generalPanelItems = flatten([ + urlInput, + displayText, + titleText, + cat([ + catalogs.anchor.map(ListOptions.createUi('anchor', 'Anchors')), + catalogs.rels.map(ListOptions.createUi('rel', 'Rel')), + catalogs.targets.map(ListOptions.createUi('target', 'Open link in...')), + catalogs.link.map(ListOptions.createUi('link', 'Link list')), + catalogs.classes.map(ListOptions.createUi('linkClass', 'Class')) + ]) + ]); + if (hasUploadPanel) { + const tabPanel = { + type: 'tabpanel', + tabs: flatten([ + [{ + title: 'General', + name: 'general', + items: generalPanelItems + }], + [UploadTab.makeTab(fileTypes, onInvalidFiles)] + ]) + }; + return tabPanel; + } + else { + return { + type: 'panel', + items: generalPanelItems + }; + } + }; const makeDialog = (settings, onSubmit, editor) => { const urlInput = [ { @@ -1211,21 +1350,14 @@ const initialData = getInitialData(settings, defaultTarget); const catalogs = settings.catalogs; const dialogDelta = DialogChanges.init(initialData, catalogs); - const body = { - type: 'panel', - items: flatten([ - urlInput, - displayText, - titleText, - cat([ - catalogs.anchor.map(ListOptions.createUi('anchor', 'Anchors')), - catalogs.rels.map(ListOptions.createUi('rel', 'Rel')), - catalogs.targets.map(ListOptions.createUi('target', 'Open link in...')), - catalogs.link.map(ListOptions.createUi('link', 'Link list')), - catalogs.classes.map(ListOptions.createUi('linkClass', 'Class')) - ]) - ]) + const helpers = { + addToBlobCache: addToBlobCache(editor), + createBlobCache: createBlobCache(editor), + alertErr: alertErr(editor), + uploadFile: uploadFile(editor), + getExistingBlobInfo: getExistingBlobInfo(editor) }; + const body = makeDialogBody(urlInput, displayText, titleText, catalogs, settings.hasUploadPanel, getDocumentsFileTypes(editor), () => new Promise((r) => helpers.alertErr('Selected files do not have allowed extensions', r))); return { title: 'Insert/Edit Link', size: 'normal', @@ -1245,9 +1377,14 @@ ], initialData, onChange: (api, { name }) => { - dialogDelta.onChange(api.getData, { name }).each((newData) => { - api.setData(newData); - }); + if (name === 'fileinput') { + changeFileInput(helpers, api); + } + else { + dialogDelta.onChange(api.getData, { name }).each((newData) => { + api.setData(newData); + }); + } }, onSubmit }; @@ -1265,7 +1402,7 @@ const register = (editor) => { editor.addCommand('mceLink', (_ui, value) => { - if ((value === null || value === void 0 ? void 0 : value.dialog) === true || !useQuickLink(editor)) { + if (value?.dialog === true || !useQuickLink(editor)) { open(editor); } else { @@ -1309,7 +1446,8 @@ if (a) { const href = getHref(a); if (/^#/.test(href)) { - const targetEl = editor.dom.select(`${href},[name="${removeLeading(href, '#')}"]`); + const id = removeLeading(href, '#'); + const targetEl = editor.dom.select(`[id="${id}"],[name="${id}"]`); if (targetEl.length) { editor.selection.scrollIntoView(targetEl[0], true); } @@ -1555,12 +1693,16 @@ setupContextToolbars(editor, openLink); }; + const PLUGIN_CODE = 'link'; var Plugin = () => { - global$5.add('link', (editor) => { + global$5.add(PLUGIN_CODE, (editor) => { register$1(editor); register(editor); setup(editor); setup$2(editor); + return { + getMetadata: () => ({ name: 'Link', type: 'opensource', slug: PLUGIN_CODE }) + }; }); }; diff --git a/public/assets/tinymce/plugins/link/plugin.min.js b/public/assets/tinymce/plugins/link/plugin.min.js index f0a85b727..218f23ea3 100644 --- a/public/assets/tinymce/plugins/link/plugin.min.js +++ b/public/assets/tinymce/plugins/link/plugin.min.js @@ -1 +1 @@ -!function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager");const t=e=>t=>(e=>{const t=typeof e;return null===e?"null":"object"===t&&Array.isArray(e)?"array":"object"===t&&(n=o=e,(r=String).prototype.isPrototypeOf(n)||(null===(l=o.constructor)||void 0===l?void 0:l.name)===r.name)?"string":t;var n,o,r,l})(t)===e,n=e=>t=>typeof t===e,o=t("string"),r=t("object"),l=t("array"),s=e=>null===e;const a=n("boolean"),i=e=>!(e=>null==e)(e),c=n("function"),u=(e,t)=>{if(l(e)){for(let n=0,o=e.length;n{},d=(e,t)=>e===t;class m{constructor(e,t){this.tag=e,this.value=t}static some(e){return new m(!0,e)}static none(){return m.singletonNone}fold(e,t){return this.tag?t(this.value):e()}isSome(){return this.tag}isNone(){return!this.tag}map(e){return this.tag?m.some(e(this.value)):m.none()}bind(e){return this.tag?e(this.value):m.none()}exists(e){return this.tag&&e(this.value)}forall(e){return!this.tag||e(this.value)}filter(e){return!this.tag||e(this.value)?this:m.none()}getOr(e){return this.tag?this.value:e}or(e){return this.tag?this:e}getOrThunk(e){return this.tag?this.value:e()}orThunk(e){return this.tag?this:e()}getOrDie(e){if(this.tag)return this.value;throw new Error(null!=e?e:"Called getOrDie on None")}static from(e){return i(e)?m.some(e):m.none()}getOrNull(){return this.tag?this.value:null}getOrUndefined(){return this.value}each(e){this.tag&&e(this.value)}toArray(){return this.tag?[this.value]:[]}toString(){return this.tag?`some(${this.value})`:"none()"}}m.singletonNone=new m(!1),Array.prototype.slice;const h=Array.prototype.indexOf,p=Array.prototype.push,f=e=>{const t=[];for(let n=0,o=e.length;n{for(let n=0;ny.call(e,t),x=(e,t,n=d)=>e.exists((e=>n(e,t))),_=e=>{const t=[],n=e=>{t.push(e)};for(let t=0;te?m.some(t):m.none(),C=e=>t=>t.options.get(e),A=C("link_assume_external_targets"),O=C("link_context_toolbar"),S=C("link_list"),N=C("link_default_target"),E=C("link_default_protocol"),R=C("link_target_list"),T=C("link_rel_list"),L=C("link_class_list"),P=C("link_title"),M=C("allow_unsafe_link_target"),D=C("link_quicklink"),B=C("link_attributes_postprocess");var I=tinymce.util.Tools.resolve("tinymce.util.URI"),K=tinymce.util.Tools.resolve("tinymce.dom.TreeWalker"),j=tinymce.util.Tools.resolve("tinymce.util.Tools");const U=e=>i(e)&&"a"===e.nodeName.toLowerCase(),q=e=>U(e)&&!!$(e),F=(e,t)=>{if(e.collapsed)return[];{const n=e.cloneContents(),o=n.firstChild,r=new K(o,n),l=[];let s=o;do{t(s)&&l.push(s)}while(s=r.next());return l}},V=e=>/^\w+:/i.test(e),$=e=>{var t,n;return null!==(n=null!==(t=e.getAttribute("data-mce-href"))&&void 0!==t?t:e.getAttribute("href"))&&void 0!==n?n:""},z=(e,t)=>{const n=["noopener"],o=e?e.split(/\s+/):[],r=e=>e.filter((e=>-1===j.inArray(n,e))),l=t?(e=>(e=r(e)).length>0?e.concat(n):n)(o):r(o);return l.length>0?(e=>j.trim(e.sort().join(" ")))(l):""},G=(e,t)=>(t=t||W(e.selection.getRng())[0]||e.selection.getNode(),Z(t)?m.from(e.dom.select("a[href]",t)[0]):m.from(e.dom.getParent(t,"a[href]"))),H=(e,t)=>G(e,t).isSome(),J=(e,t)=>t.fold((()=>e.getContent({format:"text"})),(e=>e.innerText||e.textContent||"")).replace(/\uFEFF/g,""),W=e=>F(e,q),Q=e=>j.grep(e,q),X=e=>Q(e).length>0,Y=e=>{const t=e.schema.getTextInlineElements();if(G(e).exists((e=>e.hasAttribute("data-mce-block"))))return!1;const n=e.selection.getRng();return!!n.collapsed||0===F(n,(e=>1===e.nodeType&&!U(e)&&!b(t,e.nodeName.toLowerCase()))).length},Z=e=>i(e)&&"FIGURE"===e.nodeName&&/\bimage\b/i.test(e.className),ee=(e,t,n)=>{const o=e.selection.getNode(),r=G(e,o),l=((e,t)=>{const n={...t};if(0===T(e).length&&!M(e)){const e=z(n.rel,"_blank"===n.target);n.rel=e||null}return m.from(n.target).isNone()&&!1===R(e)&&(n.target=N(e)),n.href=((e,t)=>"http"!==t&&"https"!==t||V(e)?e:t+"://"+e)(n.href,A(e)),n})(e,(e=>{return t=["title","rel","class","target"],n=(t,n)=>(e[n].each((e=>{t[n]=e.length>0?e:null})),t),o={href:e.href},((e,t)=>{for(let n=0,o=e.length;n{o=n(o,e)})),o;var t,n,o})(n)),s=B(e);i(s)&&s(l),e.undoManager.transact((()=>{n.href===t.href&&t.attach(),r.fold((()=>{((e,t,n,o)=>{const r=e.dom;Z(t)?le(r,t,o):n.fold((()=>{e.execCommand("mceInsertLink",!1,o);const t=e.selection.getEnd(),n=r.createRng();n.setStartAfter(t),n.setEndAfter(t),e.selection.setRng(n)}),(t=>{e.insertContent(r.createHTML("a",o,r.encode(t)))}))})(e,o,n.text,l)}),(t=>{e.focus(),((e,t,n,o)=>{n.each((e=>{b(t,"innerText")?t.innerText=e:t.textContent=e})),e.dom.setAttribs(t,o);const r=e.dom.createRng();r.setStartAfter(t),r.setEndAfter(t),e.selection.setRng(r)})(e,t,n.text,l)}))}))},te=e=>{const{class:t,href:n,rel:o,target:r,text:l,title:a}=e;return(e=>{const t={};var n;return((e,t,n,o)=>{((e,t)=>{const n=v(e);for(let o=0,r=n.length;o{(t(e,r)?n:o)(e,r)}))})(e,((e,t)=>!1===s(e)),(n=t,(e,t)=>{n[t]=e}),g),t})({class:t.getOrNull(),href:n,rel:o.getOrNull(),target:r.getOrNull(),text:l.getOrNull(),title:a.getOrNull()})},ne=(e,t,n)=>{const o=((e,t)=>{const n=e.options.get,o={allow_html_data_urls:n("allow_html_data_urls"),allow_script_urls:n("allow_script_urls"),allow_svg_data_urls:n("allow_svg_data_urls")},r=t.href;return{...t,href:I.isDomSafe(r,"a",o)?r:""}})(e,n);e.hasPlugin("rtc",!0)?e.execCommand("createlink",!1,te(o)):ee(e,t,o)},oe=e=>{e.hasPlugin("rtc",!0)?e.execCommand("unlink"):(e=>{e.undoManager.transact((()=>{const t=e.selection.getNode();Z(t)?re(e,t):(e=>{const t=e.dom,n=e.selection,o=n.getBookmark(),r=n.getRng().cloneRange(),l=t.getParent(r.startContainer,"a[href]",e.getBody()),s=t.getParent(r.endContainer,"a[href]",e.getBody());l&&r.setStartBefore(l),s&&r.setEndAfter(s),n.setRng(r),e.execCommand("unlink"),n.moveToBookmark(o)})(e),e.focus()}))})(e)},re=(e,t)=>{var n;const o=e.dom.select("img",t)[0];if(o){const r=e.dom.getParents(o,"a[href]",t)[0];r&&(null===(n=r.parentNode)||void 0===n||n.insertBefore(o,r),e.dom.remove(r))}},le=(e,t,n)=>{var o;const r=e.select("img",t)[0];if(r){const t=e.create("a",n);null===(o=r.parentNode)||void 0===o||o.insertBefore(t,r),t.appendChild(r)}},se=e=>o(e.value)?e.value:"",ae=(e,t)=>{const n=[];return j.each(e,(e=>{const r=(e=>o(e.text)?e.text:o(e.title)?e.title:"")(e);if(void 0!==e.menu){const o=ae(e.menu,t);n.push({text:r,items:o})}else{const o=t(e);n.push({text:r,value:o})}})),n},ie=(e=se)=>t=>m.from(t).map((t=>ae(t,e))),ce=e=>ie(se)(e),ue=ie,ge=(e,t)=>n=>({name:e,type:"listbox",label:t,items:n}),de=se,me=(e,t)=>k(t,(t=>(e=>{return b(t=e,n="items")&&void 0!==t[n]&&null!==t[n];var t,n})(t)?me(e,t.items):w(t.value===e,t))),he=(e,t)=>{const n={text:e.text,title:e.title},o=(e,o)=>{const r=(l=t,s=o,"link"===s?l.link:"anchor"===s?l.anchor:m.none()).getOr([]);var l,s;return((e,t,n,o)=>{const r=o[t],l=e.length>0;return void 0!==r?me(r,n).map((t=>({url:{value:t.value,meta:{text:l?e:t.text,attach:g}},text:l?e:t.text}))):m.none()})(n.text,o,r,e)};return{onChange:(e,t)=>{const r=t.name;return"url"===r?(e=>{const t=(o=e.url,w(n.text.length<=0,m.from(null===(r=o.meta)||void 0===r?void 0:r.text).getOr(o.value)));var o,r;const l=(e=>{var t;return w(n.title.length<=0,m.from(null===(t=e.meta)||void 0===t?void 0:t.title).getOr(""))})(e.url);return t.isSome()||l.isSome()?m.some({...t.map((e=>({text:e}))).getOr({}),...l.map((e=>({title:e}))).getOr({})}):m.none()})(e()):((e,t)=>h.call(e,t))(["anchor","link"],r)>-1?o(e(),r):"text"===r||"title"===r?(n[r]=e()[r],m.none()):m.none()}}};var pe=tinymce.util.Tools.resolve("tinymce.util.Delay");const fe=e=>{const t=e.href;return t.indexOf("@")>0&&-1===t.indexOf("/")&&-1===t.indexOf("mailto:")?m.some({message:"The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?",preprocess:e=>({...e,href:"mailto:"+t})}):m.none()},ke=(e,t)=>n=>{const o=n.href;return 1===e&&!V(o)||0===e&&/^\s*www(\.|\d\.)/i.test(o)?m.some({message:`The URL you entered seems to be an external link. Do you want to add the required ${t}:// prefix?`,preprocess:e=>({...e,href:t+"://"+o})}):m.none()},ve=e=>{const t=e.dom.select("a:not([href])"),n=f(((e,t)=>{const n=e.length,o=new Array(n);for(let r=0;r{const t=e.name||e.id;return t?[{text:t,value:"#"+t}]:[]})));return n.length>0?m.some([{text:"None",value:""}].concat(n)):m.none()},ye=e=>{const t=L(e);return t.length>0?ce(t):m.none()},be=e=>{try{return m.some(JSON.parse(e))}catch(e){return m.none()}},xe=(e,t)=>{const n=T(e);if(n.length>0){const o=x(t,"_blank"),r=e=>z(de(e),o);return(!1===M(e)?ue(r):ce)(n)}return m.none()},_e=[{text:"Current window",value:""},{text:"New window",value:"_blank"}],we=e=>{const t=R(e);return l(t)?ce(t).orThunk((()=>m.some(_e))):!1===t?m.none():m.some(_e)},Ce=(e,t,n)=>{const o=e.getAttrib(t,n);return null!==o&&o.length>0?m.some(o):m.none()},Ae=(e,t)=>(e=>{const t=t=>e.convertURL(t.value||t.url||"","href"),n=S(e);return new Promise((e=>{o(n)?fetch(n).then((e=>e.ok?e.text().then(be):Promise.reject())).then(e,(()=>e(m.none()))):c(n)?n((t=>e(m.some(t)))):e(m.from(n))})).then((e=>e.bind(ue(t)).map((e=>e.length>0?[{text:"None",value:""}].concat(e):e))))})(e).then((n=>{const o=((e,t)=>{const n=e.dom,o=Y(e)?m.some(J(e.selection,t)):m.none(),r=t.bind((e=>m.from(n.getAttrib(e,"href")))),l=t.bind((e=>m.from(n.getAttrib(e,"target")))),s=t.bind((e=>Ce(n,e,"rel"))),a=t.bind((e=>Ce(n,e,"class")));return{url:r,text:o,title:t.bind((e=>Ce(n,e,"title"))),target:l,rel:s,linkClass:a}})(e,t);return{anchor:o,catalogs:{targets:we(e),rels:xe(e,o.target),classes:ye(e),anchor:ve(e),link:n},optNode:t,flags:{titleEnabled:P(e)}}})),Oe=e=>{const t=(e=>{const t=G(e);return Ae(e,t)})(e);t.then((t=>{const n=((e,t)=>n=>{const o=n.getData();if(!o.url.value)return oe(e),void n.close();const r=e=>m.from(o[e]).filter((n=>!x(t.anchor[e],n))),l={href:o.url.value,text:r("text"),target:r("target"),rel:r("rel"),class:r("linkClass"),title:r("title")},s={href:o.url.value,attach:void 0!==o.url.meta&&o.url.meta.attach?o.url.meta.attach:g};((e,t)=>k([fe,ke(A(e),E(e))],(e=>e(t))).fold((()=>Promise.resolve(t)),(n=>new Promise((o=>{((e,t,n)=>{const o=e.selection.getRng();pe.setEditorTimeout(e,(()=>{e.windowManager.confirm(t,(t=>{e.selection.setRng(o),n(t)}))}))})(e,n.message,(e=>{o(e?n.preprocess(t):t)}))})))))(e,l).then((t=>{ne(e,s,t)})),n.close()})(e,t);return((e,t,n)=>{const o=e.anchor.text.map((()=>({name:"text",type:"input",label:"Text to display"}))).toArray(),r=e.flags.titleEnabled?[{name:"title",type:"input",label:"Title"}]:[],l=((e,t)=>{const n=e.anchor,o=n.url.getOr("");return{url:{value:o,meta:{original:{value:o}}},text:n.text.getOr(""),title:n.title.getOr(""),anchor:o,link:o,rel:n.rel.getOr(""),target:n.target.or(t).getOr(""),linkClass:n.linkClass.getOr("")}})(e,m.from(N(n))),s=e.catalogs,a=he(l,s);return{title:"Insert/Edit Link",size:"normal",body:{type:"panel",items:f([[{name:"url",type:"urlinput",filetype:"file",label:"URL",picker_text:"Browse links"}],o,r,_([s.anchor.map(ge("anchor","Anchors")),s.rels.map(ge("rel","Rel")),s.targets.map(ge("target","Open link in...")),s.link.map(ge("link","Link list")),s.classes.map(ge("linkClass","Class"))])])},buttons:[{type:"cancel",name:"cancel",text:"Cancel"},{type:"submit",name:"save",text:"Save",primary:!0}],initialData:l,onChange:(e,{name:t})=>{a.onChange(e.getData,{name:t}).each((t=>{e.setData(t)}))},onSubmit:t}})(t,n,e)})).then((t=>{e.windowManager.open(t)}))};var Se=tinymce.util.Tools.resolve("tinymce.util.VK");const Ne=(e,t)=>{if(t){const o=$(t);if(/^#/.test(o)){const t=e.dom.select(`${o},[name="${n=o,((e,t)=>((e,t)=>""===t||e.length>=t.length&&e.substr(0,0+t.length)===t)(e,t))(n,"#")?(e=>e.substring(1))(n):n}"]`);t.length&&e.selection.scrollIntoView(t[0],!0)}else(e=>{const t=document.createElement("a");t.target="_blank",t.href=e,t.rel="noreferrer noopener";const n=new MouseEvent("click",{bubbles:!0,cancelable:!0,view:window});document.dispatchEvent(n),((e,t)=>{document.body.appendChild(e),e.dispatchEvent(t),document.body.removeChild(e)})(t,n)})(t.href)}var n},Ee=(e,t)=>{const n=Q(e.dom.getParents(t));return w(1===n.length,n[0])},Re=e=>e.selection.isCollapsed()||(e=>{const t=e.selection.getRng(),n=t.startContainer;return q(n)&&t.startContainer===t.endContainer&&1===e.dom.select("img",n).length})(e)?Ee(e,e.selection.getStart()):(e=>{const t=W(e.selection.getRng());return w(t.length>0,t[0]).or(Ee(e,e.selection.getNode()))})(e),Te=e=>()=>{e.execCommand("mceLink",!1,{dialog:!0})},Le=(e,t)=>(e.on("NodeChange",t),()=>e.off("NodeChange",t)),Pe=e=>t=>{const n=()=>{t.setActive(!e.mode.isReadOnly()&&H(e,e.selection.getNode())),t.setEnabled(e.selection.isEditable())};return n(),Le(e,n)},Me=e=>t=>{const n=()=>{t.setEnabled(e.selection.isEditable())};return n(),Le(e,n)},De=e=>t=>{const n=e.dom.getParents(e.selection.getStart()),o=n=>{t.setEnabled((t=>{return X(t)||(n=e.selection.getRng(),W(n).length>0);var n})(n)&&e.selection.isEditable())};return o(n),Le(e,(e=>o(e.parents)))},Be=e=>{const t=(e=>{const t=(()=>{const e=(e=>{const t=(e=>{let t=e;return{get:()=>t,set:e=>{t=e}}})(m.none()),n=()=>t.get().each(e);return{clear:()=>{n(),t.set(m.none())},isSet:()=>t.get().isSome(),get:()=>t.get(),set:e=>{n(),t.set(m.some(e))}}})(g);return{...e,on:t=>e.get().each(t)}})(),n=()=>t.get().or(Re(e));return e.on("contextmenu",(n=>{Ee(e,n.target).each(t.set)})),e.on("SelectionChange",(()=>{t.isSet()||Re(e).each(t.set)})),e.on("click",(n=>{t.clear();const o=Q(e.dom.getParents(n.target));1===o.length&&Se.metaKeyPressed(n)&&(n.preventDefault(),Ne(e,o[0]))})),e.on("keydown",(o=>{t.clear(),!o.isDefaultPrevented()&&13===o.keyCode&&(e=>!0===e.altKey&&!1===e.shiftKey&&!1===e.ctrlKey&&!1===e.metaKey)(o)&&n().each((t=>{o.preventDefault(),Ne(e,t)}))})),{gotoSelectedLink:()=>n().each((t=>Ne(e,t)))}})(e);((e,t)=>{e.ui.registry.addToggleButton("link",{icon:"link",tooltip:"Insert/edit link",shortcut:"Meta+K",onAction:Te(e),onSetup:Pe(e)}),e.ui.registry.addButton("openlink",{icon:"new-tab",tooltip:"Open link",onAction:t.gotoSelectedLink,onSetup:De(e)}),e.ui.registry.addButton("unlink",{icon:"unlink",tooltip:"Remove link",onAction:()=>oe(e),onSetup:De(e)})})(e,t),((e,t)=>{e.ui.registry.addMenuItem("openlink",{text:"Open link",icon:"new-tab",onAction:t.gotoSelectedLink,onSetup:De(e)}),e.ui.registry.addMenuItem("link",{icon:"link",text:"Link...",shortcut:"Meta+K",onAction:Te(e),onSetup:Me(e)}),e.ui.registry.addMenuItem("unlink",{icon:"unlink",text:"Remove link",onAction:()=>oe(e),onSetup:De(e)})})(e,t),(e=>{e.ui.registry.addContextMenu("link",{update:t=>e.dom.isEditable(t)?X(e.dom.getParents(t,"a"))?"link unlink openlink":"link":""})})(e),((e,t)=>{const n=t=>{const n=e.selection.getNode();return t.setEnabled(H(e,n)&&e.selection.isEditable()),g};e.ui.registry.addContextForm("quicklink",{launch:{type:"contextformtogglebutton",icon:"link",tooltip:"Link",onSetup:Pe(e)},label:"Link",predicate:t=>O(e)&&H(e,t),initValue:()=>G(e).fold((()=>""),$),commands:[{type:"contextformtogglebutton",icon:"link",tooltip:"Link",primary:!0,onSetup:t=>{const n=e.selection.getNode();return t.setActive(H(e,n)),Pe(e)(t)},onAction:t=>{const n=t.getValue(),o=(t=>{const n=G(e),o=Y(e);if(n.isNone()&&o){const o=J(e.selection,n);return w(0===o.length,t)}return m.none()})(n);ne(e,{href:n,attach:g},{href:n,text:o,title:m.none(),rel:m.none(),target:m.from(N(e)),class:m.none()}),(e=>{e.selection.collapse(!1)})(e),t.hide()}},{type:"contextformbutton",icon:"unlink",tooltip:"Remove link",onSetup:n,onAction:t=>{oe(e),t.hide()}},{type:"contextformbutton",icon:"new-tab",tooltip:"Open link",onSetup:n,onAction:e=>{t.gotoSelectedLink(),e.hide()}}]})})(e,t)};e.add("link",(e=>{(e=>{const t=e.options.register;t("link_assume_external_targets",{processor:e=>{const t=o(e)||a(e);return t?!0===e?{value:1,valid:t}:"http"===e||"https"===e?{value:e,valid:t}:{value:0,valid:t}:{valid:!1,message:"Must be a string or a boolean."}},default:!1}),t("link_context_toolbar",{processor:"boolean",default:!1}),t("link_list",{processor:e=>o(e)||c(e)||u(e,r)}),t("link_default_target",{processor:"string"}),t("link_default_protocol",{processor:"string",default:"https"}),t("link_target_list",{processor:e=>a(e)||u(e,r),default:!0}),t("link_rel_list",{processor:"object[]",default:[]}),t("link_class_list",{processor:"object[]",default:[]}),t("link_title",{processor:"boolean",default:!0}),t("allow_unsafe_link_target",{processor:"boolean",default:!1}),t("link_quicklink",{processor:"boolean",default:!1}),t("link_attributes_postprocess",{processor:"function"})})(e),(e=>{e.addCommand("mceLink",((t,n)=>{!0!==(null==n?void 0:n.dialog)&&D(e)?e.dispatch("contexttoolbar-show",{toolbarKey:"quicklink"}):Oe(e)}))})(e),Be(e),(e=>{e.addShortcut("Meta+K","",(()=>{e.execCommand("mceLink")}))})(e)}))}(); \ No newline at end of file +!function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager");const t=e=>t=>(e=>{const t=typeof e;return null===e?"null":"object"===t&&Array.isArray(e)?"array":"object"===t&&(n=o=e,(r=String).prototype.isPrototypeOf(n)||o.constructor?.name===r.name)?"string":t;var n,o,r})(t)===e,n=e=>t=>typeof t===e,o=t("string"),r=t("object"),l=t("array"),a=e=>null===e;const s=n("boolean"),i=e=>!(e=>null==e)(e),c=n("function"),u=(e,t)=>{if(l(e)){for(let n=0,o=e.length;n{},g=e=>e,m=(e,t)=>e===t;class h{tag;value;static singletonNone=new h(!1);constructor(e,t){this.tag=e,this.value=t}static some(e){return new h(!0,e)}static none(){return h.singletonNone}fold(e,t){return this.tag?t(this.value):e()}isSome(){return this.tag}isNone(){return!this.tag}map(e){return this.tag?h.some(e(this.value)):h.none()}bind(e){return this.tag?e(this.value):h.none()}exists(e){return this.tag&&e(this.value)}forall(e){return!this.tag||e(this.value)}filter(e){return!this.tag||e(this.value)?this:h.none()}getOr(e){return this.tag?this.value:e}or(e){return this.tag?this:e}getOrThunk(e){return this.tag?this.value:e()}orThunk(e){return this.tag?this:e()}getOrDie(e){if(this.tag)return this.value;throw new Error(e??"Called getOrDie on None")}static from(e){return i(e)?h.some(e):h.none()}getOrNull(){return this.tag?this.value:null}getOrUndefined(){return this.value}each(e){this.tag&&e(this.value)}toArray(){return this.tag?[this.value]:[]}toString(){return this.tag?`some(${this.value})`:"none()"}}Array.prototype.slice;const p=Array.prototype.indexOf,f=Array.prototype.push,k=e=>{const t=[];for(let n=0,o=e.length;n{for(let n=0;ny.call(e,t),_=(e,t,n=m)=>e.exists(e=>n(e,t)),w=e=>{const t=[],n=e=>{t.push(e)};for(let t=0;te?h.some(t):h.none(),O=e=>t=>t.options.get(e),A=O("link_assume_external_targets"),S=O("link_context_toolbar"),E=O("link_list"),N=O("link_default_target"),R=O("link_default_protocol"),L=O("link_target_list"),T=O("link_rel_list"),P=O("link_class_list"),U=O("link_title"),B=O("allow_unsafe_link_target"),D=O("link_quicklink"),M=O("link_attributes_postprocess"),F=O("files_upload_handler"),I=O("link_uploadtab"),j=O("documents_file_types");var K=tinymce.util.Tools.resolve("tinymce.util.URI"),q=tinymce.util.Tools.resolve("tinymce.dom.TreeWalker"),$=tinymce.util.Tools.resolve("tinymce.util.Tools");const V=e=>i(e)&&"a"===e.nodeName.toLowerCase(),z=e=>V(e)&&!!J(e),G=(e,t)=>{if(e.collapsed)return[];{const n=e.cloneContents(),o=n.firstChild,r=new q(o,n),l=[];let a=o;do{t(a)&&l.push(a)}while(a=r.next());return l}},H=e=>/^\w+:/i.test(e),J=e=>e.getAttribute("data-mce-href")??e.getAttribute("href")??"",W=(e,t)=>{const n=["noopener"],o=e?e.split(/\s+/):[],r=e=>e.filter(e=>-1===$.inArray(n,e)),l=t?(e=>(e=r(e)).length>0?e.concat(n):n)(o):r(o);return l.length>0?(e=>$.trim(e.sort().join(" ")))(l):""},Q=(e,t)=>(t=t||Z(e.selection.getRng())[0]||e.selection.getNode(),oe(t)?h.from(e.dom.select("a[href]",t)[0]):h.from(e.dom.getParent(t,"a[href]"))),X=(e,t)=>Q(e,t).isSome(),Y=(e,t)=>t.fold(()=>e.getContent({format:"text"}),e=>e.innerText||e.textContent||"").replace(/\uFEFF/g,""),Z=e=>G(e,z),ee=e=>$.grep(e,z),te=e=>ee(e).length>0,ne=e=>{const t=e.schema.getTextInlineElements();if(Q(e).exists(e=>e.hasAttribute("data-mce-block")))return!1;const n=e.selection.getRng();return!!n.collapsed||0===G(n,e=>1===e.nodeType&&!V(e)&&!x(t,e.nodeName.toLowerCase())).length},oe=e=>i(e)&&"FIGURE"===e.nodeName&&/\bimage\b/i.test(e.className),re=(e,t,n)=>{const o=e.selection.getNode(),r=Q(e,o),l=((e,t)=>{const n={...t};if(0===T(e).length&&!B(e)){const e=W(n.rel,"_blank"===n.target);n.rel=e||null}return h.from(n.target).isNone()&&!1===L(e)&&(n.target=N(e)),n.href=((e,t)=>"http"!==t&&"https"!==t||H(e)?e:t+"://"+e)(n.href,A(e)),n})(e,(e=>{return t=["title","rel","class","target"],n=(t,n)=>(e[n].each(e=>{t[n]=e.length>0?e:null}),t),o={href:e.href},((e,t)=>{for(let n=0,o=e.length;n{o=n(o,e)}),o;var t,n,o})(n)),a=M(e);i(a)&&a(l),e.undoManager.transact(()=>{n.href===t.href&&t.attach(),r.fold(()=>{((e,t,n,o)=>{const r=e.dom;oe(t)?ce(r,t,o):n.fold(()=>{e.execCommand("mceInsertLink",!1,o);const t=e.selection.getEnd(),n=r.createRng();n.setStartAfter(t),n.setEndAfter(t),e.selection.setRng(n)},t=>{e.insertContent(r.createHTML("a",o,r.encode(t)))})})(e,o,n.text,l)},t=>{e.focus(),((e,t,n,o)=>{n.each(e=>{x(t,"innerText")?t.innerText=e:t.textContent=e}),e.dom.setAttribs(t,o);const r=e.dom.createRng();r.setStartAfter(t),r.setEndAfter(t),e.selection.setRng(r)})(e,t,n.text,l)})})},le=e=>{const{class:t,href:n,rel:o,target:r,text:l,title:s}=e;return(e=>{const t={};var n;return((e,t,n,o)=>{((e,t)=>{const n=v(e);for(let o=0,r=n.length;o{(t(e,r)?n:o)(e,r)})})(e,(e,t)=>!1===a(e),(n=t,(e,t)=>{n[t]=e}),d),t})({class:t.getOrNull(),href:n,rel:o.getOrNull(),target:r.getOrNull(),text:l.getOrNull(),title:s.getOrNull()})},ae=(e,t,n)=>{const o=((e,t)=>{const n=e.options.get,o={allow_html_data_urls:n("allow_html_data_urls"),allow_script_urls:n("allow_script_urls"),allow_svg_data_urls:n("allow_svg_data_urls")},r=t.href;return{...t,href:K.isDomSafe(r,"a",o)?r:""}})(e,n);e.hasPlugin("rtc",!0)?e.execCommand("createlink",!1,le(o)):re(e,t,o)},se=e=>{e.hasPlugin("rtc",!0)?e.execCommand("unlink"):(e=>{e.undoManager.transact(()=>{const t=e.selection.getNode();oe(t)?ie(e,t):(e=>{const t=e.dom,n=e.selection,o=n.getRng().cloneRange(),r=n.getBookmark(),l=t.getParent(o.startContainer,"a[href]",e.getBody()),a=t.getParent(o.endContainer,"a[href]",e.getBody());l&&o.setStartBefore(l),a&&o.setEndAfter(a),n.setRng(o),e.execCommand("unlink"),n.moveToBookmark(r)})(e),e.focus()})})(e)},ie=(e,t)=>{const n=e.dom.select("img",t)[0];if(n){const o=e.dom.getParents(n,"a[href]",t)[0];o&&(o.parentNode?.insertBefore(n,o),e.dom.remove(o))}},ce=(e,t,n)=>{const o=e.select("img",t)[0];if(o){const t=e.create("a",n);o.parentNode?.insertBefore(t,o),t.appendChild(o)}},ue=e=>o(e.value)?e.value:"",de=(e,t)=>{const n=[];return $.each(e,e=>{const r=(e=>o(e.text)?e.text:o(e.title)?e.title:"")(e);if(void 0!==e.menu){const o=de(e.menu,t);n.push({text:r,items:o})}else{const o=t(e);n.push({text:r,value:o})}}),n},ge=(e=ue)=>t=>h.from(t).map(t=>de(t,e)),me=e=>ge(ue)(e),he=ge,pe=(e,t)=>n=>({name:e,type:"listbox",label:t,items:n}),fe=ue,ke=(e,t)=>b(t,t=>(e=>{return x(t=e,n="items")&&void 0!==t[n]&&null!==t[n];var t,n})(t)?ke(e,t.items):C(t.value===e,t)),be=(e,t)=>{const n={text:e.text,title:e.title},o=(e,o)=>{const r=(l=t,a=o,"link"===a?l.link:"anchor"===a?l.anchor:h.none()).getOr([]);var l,a;return((e,t,n,o)=>{const r=o[t],l=e.length>0;return void 0!==r?ke(r,n).map(t=>({url:{value:t.value,meta:{text:l?e:t.text,attach:d}},text:l?e:t.text})):h.none()})(n.text,o,r,e)};return{onChange:(e,t)=>{const r=t.name;return"url"===r?(e=>{const t=(o=e.url,C(n.text.length<=0,h.from(o.meta?.text).getOr(o.value)));var o;const r=(e=>C(n.title.length<=0,h.from(e.meta?.title).getOr("")))(e.url);return t.isSome()||r.isSome()?h.some({...t.map(e=>({text:e})).getOr({}),...r.map(e=>({title:e})).getOr({})}):h.none()})(e()):((e,t)=>p.call(e,t))(["anchor","link"],r)>-1?o(e(),r):"text"===r||"title"===r?(n[r]=e()[r],h.none()):h.none()}}};var ve=tinymce.util.Tools.resolve("tinymce.util.Delay");const ye=e=>{const t=e.href;return t.indexOf("@")>0&&-1===t.indexOf("/")&&-1===t.indexOf("mailto:")?h.some({message:"The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?",preprocess:e=>({...e,href:"mailto:"+t})}):h.none()},xe=(e,t)=>n=>{const o=n.href;return 1===e&&!H(o)||0===e&&/^\s*www(\.|\d\.)/i.test(o)?h.some({message:`The URL you entered seems to be an external link. Do you want to add the required ${t}:// prefix?`,preprocess:e=>({...e,href:t+"://"+o})}):h.none()},_e=e=>{const t=e.dom.select("a:not([href])"),n=k(((e,t)=>{const n=e.length,o=new Array(n);for(let r=0;r{const t=e.name||e.id;return t?[{text:t,value:"#"+t}]:[]}));return n.length>0?h.some([{text:"None",value:""}].concat(n)):h.none()},we=e=>{const t=P(e);return t.length>0?me(t):h.none()},Ce=e=>{try{return h.some(JSON.parse(e))}catch{return h.none()}},Oe=(e,t)=>{const n=T(e);if(n.length>0){const o=_(t,"_blank"),r=e=>W(fe(e),o);return(!1===B(e)?he(r):me)(n)}return h.none()},Ae=[{text:"Current window",value:""},{text:"New window",value:"_blank"}],Se=e=>{const t=L(e);return l(t)?me(t).orThunk(()=>h.some(Ae)):!1===t?h.none():h.some(Ae)},Ee=(e,t,n)=>{const o=e.getAttrib(t,n);return null!==o&&o.length>0?h.some(o):h.none()},Ne=(e,t)=>(e=>{const t=t=>e.convertURL(t.value||t.url||"","href"),n=E(e);return new Promise(e=>{o(n)?fetch(n).then(e=>e.ok?e.text().then(Ce):Promise.reject()).then(e,()=>e(h.none())):c(n)?n(t=>e(h.some(t))):e(h.from(n))}).then(e=>e.bind(he(t)).map(e=>e.length>0?[{text:"None",value:""}].concat(e):e))})(e).then(n=>{const o=(e=>i(e.options.get("files_upload_handler")))(e)&&(e=>i(e.options.get("documents_file_types")))(e)&&I(e),r=((e,t)=>{const n=e.dom,o=ne(e)?h.some(Y(e.selection,t)):h.none(),r=t.bind(e=>h.from(n.getAttrib(e,"href"))),l=t.bind(e=>h.from(n.getAttrib(e,"target"))),a=t.bind(e=>Ee(n,e,"rel")),s=t.bind(e=>Ee(n,e,"class"));return{url:r,text:o,title:t.bind(e=>Ee(n,e,"title")),target:l,rel:a,linkClass:s}})(e,t);return{anchor:r,catalogs:{targets:Se(e),rels:Oe(e,r.target),classes:we(e),anchor:_e(e),link:n},hasUploadPanel:o,optNode:t,flags:{titleEnabled:U(e)}}}),Re=(e,t)=>({title:"Upload",name:"upload",items:[{type:"dropzone",name:"fileinput",buttonLabel:"Browse for a file",dropAreaLabel:"Drop a file here",allowedFileTypes:e.map(e=>e.mimeType).join(","),allowedFileExtensions:k(e.map(e=>e.extensions)),onInvalidFiles:t}]}),Le=e=>(t,n)=>F(e)(t,n),Te=(e,t)=>{const n=t.getData();var o;t.block("Uploading file"),(o=n.fileinput,(e=>0{t.unblock()},n=>{const o=URL.createObjectURL(n),r=()=>{t.unblock(),URL.revokeObjectURL(o)};var l;(l=n,new Promise((e,t)=>{const n=new FileReader;n.onload=()=>{e(n.result)},n.onerror=()=>{t(new Error(n.error?.message??"Failed to convert blob to a data url"))},n.readAsDataURL(l)})).then(t=>{const r=e.getExistingBlobInfo((e=>h.from(e.split(",")[1]).getOr(""))(t),n.type),l=r&&r.filename()===n.name?r:e.createBlobCache(n,o,t);return e.addToBlobCache(l),e.uploadFile(l,g)}).then(e=>{(({url:e,fileName:n})=>{t.setData({text:n,title:n,url:{value:e,meta:{}}}),t.showTab("general"),t.focus("url")})(e),r()}).catch(n=>{r(),e.alertErr(n,()=>{t.focus("fileinput")})})})},Pe=e=>(t,n,o)=>e.editorUpload.blobCache.create({blob:t,blobUri:n,name:t.name?.replace(/\.[^\.]+$/,""),filename:t.name,base64:o.split(",")[1],allowEmptyFile:!0}),Ue=e=>t=>{e.editorUpload.blobCache.add(t)},Be=e=>(t,n)=>e.editorUpload.blobCache.getByData(t,n),De=e=>(t,n)=>{e.windowManager.alert(t,n)},Me=(e,t,n)=>{const o=e.anchor.text.map(()=>({name:"text",type:"input",label:"Text to display"})).toArray(),r=e.flags.titleEnabled?[{name:"title",type:"input",label:"Title"}]:[],l=((e,t)=>{const n=e.anchor,o=n.url.getOr("");return{url:{value:o,meta:{original:{value:o}}},text:n.text.getOr(""),title:n.title.getOr(""),anchor:o,link:o,rel:n.rel.getOr(""),target:n.target.or(t).getOr(""),linkClass:n.linkClass.getOr(""),fileinput:[]}})(e,h.from(N(n))),a=e.catalogs,s=be(l,a),i={addToBlobCache:Ue(n),createBlobCache:Pe(n),alertErr:De(n),uploadFile:Le(n),getExistingBlobInfo:Be(n)},c=((e,t,n,o,r,l)=>{const a=k([[{name:"url",type:"urlinput",filetype:"file",label:"URL",picker_text:"Browse links"}],t,n,w([o.anchor.map(pe("anchor","Anchors")),o.rels.map(pe("rel","Rel")),o.targets.map(pe("target","Open link in...")),o.link.map(pe("link","Link list")),o.classes.map(pe("linkClass","Class"))])]);return r?{type:"tabpanel",tabs:k([[{title:"General",name:"general",items:a}],[Re(l,()=>new Promise(e=>i.alertErr("Selected files do not have allowed extensions",e)))]])}:{type:"panel",items:a}})(0,o,r,a,e.hasUploadPanel,j(n));return{title:"Insert/Edit Link",size:"normal",body:c,buttons:[{type:"cancel",name:"cancel",text:"Cancel"},{type:"submit",name:"save",text:"Save",primary:!0}],initialData:l,onChange:(e,{name:t})=>{"fileinput"===t?Te(i,e):s.onChange(e.getData,{name:t}).each(t=>{e.setData(t)})},onSubmit:t}},Fe=e=>{const t=(e=>{const t=Q(e);return Ne(e,t)})(e);t.then(t=>{const n=((e,t)=>n=>{const o=n.getData();if(!o.url.value)return se(e),void n.close();const r=e=>h.from(o[e]).filter(n=>!_(t.anchor[e],n)),l={href:o.url.value,text:r("text"),target:r("target"),rel:r("rel"),class:r("linkClass"),title:r("title")},a={href:o.url.value,attach:void 0!==o.url.meta&&o.url.meta.attach?o.url.meta.attach:d};((e,t)=>b([ye,xe(A(e),R(e))],e=>e(t)).fold(()=>Promise.resolve(t),n=>new Promise(o=>{((e,t,n)=>{const o=e.selection.getRng();ve.setEditorTimeout(e,()=>{e.windowManager.confirm(t,t=>{e.selection.setRng(o),n(t)})})})(e,n.message,e=>{o(e?n.preprocess(t):t)})})))(e,l).then(t=>{ae(e,a,t)}),n.close()})(e,t);return Me(t,n,e)}).then(t=>{e.windowManager.open(t)})};var Ie=tinymce.util.Tools.resolve("tinymce.util.VK");const je=(e,t)=>{if(t){const o=J(t);if(/^#/.test(o)){const t=((e,t)=>((e,t)=>""===t||e.length>=t.length&&e.substr(0,0+t.length)===t)(e,t))(n=o,"#")?(e=>e.substring(1))(n):n,r=e.dom.select(`[id="${t}"],[name="${t}"]`);r.length&&e.selection.scrollIntoView(r[0],!0)}else(e=>{const t=document.createElement("a");t.target="_blank",t.href=e,t.rel="noreferrer noopener";const n=new MouseEvent("click",{bubbles:!0,cancelable:!0,view:window});document.dispatchEvent(n),((e,t)=>{document.body.appendChild(e),e.dispatchEvent(t),document.body.removeChild(e)})(t,n)})(t.href)}var n},Ke=(e,t)=>{const n=ee(e.dom.getParents(t));return C(1===n.length,n[0])},qe=e=>e.selection.isCollapsed()||(e=>{const t=e.selection.getRng(),n=t.startContainer;return z(n)&&t.startContainer===t.endContainer&&1===e.dom.select("img",n).length})(e)?Ke(e,e.selection.getStart()):(e=>{const t=Z(e.selection.getRng());return C(t.length>0,t[0]).or(Ke(e,e.selection.getNode()))})(e),$e=e=>()=>{e.execCommand("mceLink",!1,{dialog:!0})},Ve=(e,t)=>(e.on("NodeChange",t),()=>e.off("NodeChange",t)),ze=e=>t=>{const n=()=>{t.setActive(!e.mode.isReadOnly()&&X(e,e.selection.getNode())),t.setEnabled(e.selection.isEditable())};return n(),Ve(e,n)},Ge=e=>t=>{const n=()=>{t.setEnabled(e.selection.isEditable())};return n(),Ve(e,n)},He=e=>t=>{const n=e.dom.getParents(e.selection.getStart()),o=n=>{t.setEnabled((t=>{return te(t)||(n=e.selection.getRng(),Z(n).length>0);var n})(n)&&e.selection.isEditable())};return o(n),Ve(e,e=>o(e.parents))},Je=e=>{const t=(e=>{const t=(()=>{const e=(e=>{const t=(e=>{let t=e;return{get:()=>t,set:e=>{t=e}}})(h.none()),n=()=>t.get().each(e);return{clear:()=>{n(),t.set(h.none())},isSet:()=>t.get().isSome(),get:()=>t.get(),set:e=>{n(),t.set(h.some(e))}}})(d);return{...e,on:t=>e.get().each(t)}})(),n=()=>t.get().or(qe(e));return e.on("contextmenu",n=>{Ke(e,n.target).each(t.set)}),e.on("SelectionChange",()=>{t.isSet()||qe(e).each(t.set)}),e.on("click",n=>{t.clear();const o=ee(e.dom.getParents(n.target));1===o.length&&Ie.metaKeyPressed(n)&&(n.preventDefault(),je(e,o[0]))}),e.on("keydown",o=>{t.clear(),!o.isDefaultPrevented()&&13===o.keyCode&&(e=>!0===e.altKey&&!1===e.shiftKey&&!1===e.ctrlKey&&!1===e.metaKey)(o)&&n().each(t=>{o.preventDefault(),je(e,t)})}),{gotoSelectedLink:()=>n().each(t=>je(e,t))}})(e);((e,t)=>{e.ui.registry.addToggleButton("link",{icon:"link",tooltip:"Insert/edit link",shortcut:"Meta+K",onAction:$e(e),onSetup:ze(e)}),e.ui.registry.addButton("openlink",{icon:"new-tab",tooltip:"Open link",onAction:t.gotoSelectedLink,onSetup:He(e)}),e.ui.registry.addButton("unlink",{icon:"unlink",tooltip:"Remove link",onAction:()=>se(e),onSetup:He(e)})})(e,t),((e,t)=>{e.ui.registry.addMenuItem("openlink",{text:"Open link",icon:"new-tab",onAction:t.gotoSelectedLink,onSetup:He(e)}),e.ui.registry.addMenuItem("link",{icon:"link",text:"Link...",shortcut:"Meta+K",onAction:$e(e),onSetup:Ge(e)}),e.ui.registry.addMenuItem("unlink",{icon:"unlink",text:"Remove link",onAction:()=>se(e),onSetup:He(e)})})(e,t),(e=>{e.ui.registry.addContextMenu("link",{update:t=>e.dom.isEditable(t)?te(e.dom.getParents(t,"a"))?"link unlink openlink":"link":""})})(e),((e,t)=>{const n=t=>{const n=e.selection.getNode();return t.setEnabled(X(e,n)&&e.selection.isEditable()),d};e.ui.registry.addContextForm("quicklink",{launch:{type:"contextformtogglebutton",icon:"link",tooltip:"Link",onSetup:ze(e)},label:"Link",predicate:t=>S(e)&&X(e,t),initValue:()=>Q(e).fold(()=>"",J),commands:[{type:"contextformtogglebutton",icon:"link",tooltip:"Link",primary:!0,onSetup:t=>{const n=e.selection.getNode();return t.setActive(X(e,n)),ze(e)(t)},onAction:t=>{const n=t.getValue(),o=(t=>{const n=Q(e),o=ne(e);if(n.isNone()&&o){const o=Y(e.selection,n);return C(0===o.length,t)}return h.none()})(n);ae(e,{href:n,attach:d},{href:n,text:o,title:h.none(),rel:h.none(),target:h.from(N(e)),class:h.none()}),(e=>{e.selection.collapse(!1)})(e),t.hide()}},{type:"contextformbutton",icon:"unlink",tooltip:"Remove link",onSetup:n,onAction:t=>{se(e),t.hide()}},{type:"contextformbutton",icon:"new-tab",tooltip:"Open link",onSetup:n,onAction:e=>{t.gotoSelectedLink(),e.hide()}}]})})(e,t)},We="link";e.add(We,e=>((e=>{const t=e.options.register;t("link_assume_external_targets",{processor:e=>{const t=o(e)||s(e);return t?!0===e?{value:1,valid:t}:"http"===e||"https"===e?{value:e,valid:t}:{value:0,valid:t}:{valid:!1,message:"Must be a string or a boolean."}},default:!1}),t("link_context_toolbar",{processor:"boolean",default:!1}),t("link_list",{processor:e=>o(e)||c(e)||u(e,r)}),t("link_default_target",{processor:"string"}),t("link_default_protocol",{processor:"string",default:"https"}),t("link_target_list",{processor:e=>s(e)||u(e,r),default:!0}),t("link_rel_list",{processor:"object[]",default:[]}),t("link_class_list",{processor:"object[]",default:[]}),t("link_title",{processor:"boolean",default:!0}),t("allow_unsafe_link_target",{processor:"boolean",default:!1}),t("link_quicklink",{processor:"boolean",default:!1}),t("link_attributes_postprocess",{processor:"function"}),t("files_upload_handler",{processor:"function"}),t("link_uploadtab",{processor:"boolean",default:!0})})(e),(e=>{e.addCommand("mceLink",(t,n)=>{!0!==n?.dialog&&D(e)?e.dispatch("contexttoolbar-show",{toolbarKey:"quicklink"}):Fe(e)})})(e),Je(e),(e=>{e.addShortcut("Meta+K","",()=>{e.execCommand("mceLink")})})(e),{getMetadata:()=>({name:"Link",type:"opensource",slug:We})}))}(); \ No newline at end of file diff --git a/public/assets/tinymce/plugins/lists/plugin.js b/public/assets/tinymce/plugins/lists/plugin.js index b5a7cf069..bc7d75406 100644 --- a/public/assets/tinymce/plugins/lists/plugin.js +++ b/public/assets/tinymce/plugins/lists/plugin.js @@ -1,5 +1,5 @@ /** - * TinyMCE version 8.1.2 (TBD) + * TinyMCE version 8.10.0 (2026-10-14) */ (function () { @@ -45,6 +45,11 @@ * strict-null-checks */ class Optional { + tag; + value; + // Sneaky optimisation: every instance of Optional.none is identical, so just + // reuse the same object + static singletonNone = new Optional(false); // The internal representation has a `tag` and a `value`, but both are // private: able to be console.logged, but not able to be accessed by code constructor(tag, value) { @@ -212,7 +217,7 @@ */ getOrDie(message) { if (!this.tag) { - throw new Error(message !== null && message !== void 0 ? message : 'Called getOrDie on None'); + throw new Error(message ?? 'Called getOrDie on None'); } else { return this.value; @@ -276,9 +281,6 @@ return this.tag ? `some(${this.value})` : 'none()'; } } - // Sneaky optimisation: every instance of Optional.none is identical, so just - // reuse the same object - Optional.singletonNone = new Optional(false); const nativeSlice = Array.prototype.slice; const exists = (xs, pred) => { @@ -462,12 +464,12 @@ const listSelector = listNames.join(','); const getParentList = (editor, node) => { const selectionStart = node || editor.selection.getStart(true); - return editor.dom.getParent(selectionStart, listSelector, getClosestListHost(editor, selectionStart)); + return editor.dom.getParent(selectionStart, listSelector, getClosestListHost(editor, selectionStart, editor.selection.isCollapsed())); }; - const getClosestListHost = (editor, elm) => { + const getClosestListHost = (editor, elm, isCollapsed) => { const parentBlocks = editor.dom.getParents(elm, editor.dom.isBlock); const isNotForcedRootBlock = (elm) => elm.nodeName.toLowerCase() !== getForcedRootBlock(editor); - const parentBlock = find(parentBlocks, (elm) => isNotForcedRootBlock(elm) && isListHost(editor.schema, elm)); + const parentBlock = find(parentBlocks, (elm) => (!isCollapsed || isNotForcedRootBlock(elm)) && isListHost(editor.schema, elm)); return parentBlock.getOr(editor.getBody()); }; const isListHost = (schema, node) => !isListNode(node) && !isListItemNode(node) && exists(listNames, (listName) => schema.isValidChild(node.nodeName, listName)); @@ -581,12 +583,16 @@ }); }; + const PLUGIN_CODE = 'lists'; var Plugin = () => { - global.add('lists', (editor) => { + global.add(PLUGIN_CODE, (editor) => { register$2(editor); register$1(editor); register(editor); - return get(editor); + return { + ...get(editor), + getMetadata: () => ({ name: 'Lists', type: 'opensource', slug: PLUGIN_CODE }) + }; }); }; diff --git a/public/assets/tinymce/plugins/lists/plugin.min.js b/public/assets/tinymce/plugins/lists/plugin.min.js index 8169b1ee8..f53736e74 100644 --- a/public/assets/tinymce/plugins/lists/plugin.min.js +++ b/public/assets/tinymce/plugins/lists/plugin.min.js @@ -1 +1 @@ -!function(){"use strict";var t=tinymce.util.Tools.resolve("tinymce.PluginManager");const e=t=>!(t=>null==t)(t),r=t=>"function"==typeof t;const s=(t,e)=>t===e,n=()=>false;class o{constructor(t,e){this.tag=t,this.value=e}static some(t){return new o(!0,t)}static none(){return o.singletonNone}fold(t,e){return this.tag?e(this.value):t()}isSome(){return this.tag}isNone(){return!this.tag}map(t){return this.tag?o.some(t(this.value)):o.none()}bind(t){return this.tag?t(this.value):o.none()}exists(t){return this.tag&&t(this.value)}forall(t){return!this.tag||t(this.value)}filter(t){return!this.tag||t(this.value)?this:o.none()}getOr(t){return this.tag?this.value:t}or(t){return this.tag?this:t}getOrThunk(t){return this.tag?this.value:t()}orThunk(t){return this.tag?this:t()}getOrDie(t){if(this.tag)return this.value;throw new Error(null!=t?t:"Called getOrDie on None")}static from(t){return e(t)?o.some(t):o.none()}getOrNull(){return this.tag?this.value:null}getOrUndefined(){return this.value}each(t){this.tag&&t(this.value)}toArray(){return this.tag?[this.value]:[]}toString(){return this.tag?`some(${this.value})`:"none()"}}o.singletonNone=new o(!1);const a=Array.prototype.slice,i=(t,e,r)=>{for(let s=0,n=t.length;st.exists((t=>r(t,e))),u=(c=/^\s+|\s+$/g,t=>t.replace(c,""));var c;const d=t=>{const e=(t=>{const e=a.call(t,0);return e.reverse(),e})(u(t).split("")),r=((t,e)=>{const r=t.length,s=new Array(r);for(let n=0;n{const r=t.toUpperCase().charCodeAt(0)-"A".charCodeAt(0)+1;return Math.pow(26,e)*r}));return s=(t,e)=>t+e,n=0,((t,e)=>{for(let r=0,s=t.length;r{n=s(n,t)})),n;var s,n},m=t=>{if(--t<0)return"";{const e=t%26,r=Math.floor(t/26);return m(r)+String.fromCharCode("A".charCodeAt(0)+e)}},g=t=>{const e=parseInt(t.start,10);return l(t.listStyleType,"upper-alpha")?m(e):l(t.listStyleType,"lower-alpha")?m(e).toLowerCase():t.start},h=t=>t.options.get("forced_root_block");const p=t=>r=>e(r)&&t.test(r.nodeName),y=p(/^(OL|UL|DL)$/),v=p(/^(TH|TD)$/),f=p(/^(LI|DT|DD)$/),b=(t,e)=>i(t,y,v).exists((t=>t.nodeName===e&&!(t=>/\btox\-/.test(t.className))(t))),L=(t,e)=>{const r=t.selection.getNode();return e({parents:t.dom.getParents(r),element:r}),t.on("NodeChange",e),()=>t.off("NodeChange",e)},S=(t,e)=>{const r=t.dom.getParent(e,"ol,ul,dl");return((t,e)=>null!==e&&!t.dom.isEditable(e))(t,r)||!t.selection.isEditable()},C=t=>e(t)&&"ol"===t.nodeName.toLowerCase(),A=["OL","UL","DL"],T=A.join(","),N=(t,e)=>{const r=e||t.selection.getStart(!0);return t.dom.getParent(r,T,w(t,r))},w=(t,e)=>{const r=t.dom.getParents(e,t.dom.isBlock),s=(o=e=>(e=>e.nodeName.toLowerCase()!==h(t))(e)&&O(t.schema,e),i(r,o,n));var o;return s.getOr(t.getBody())},O=(t,e)=>!y(e)&&!f(e)&&(r=>{for(let n=0,o=r.length;nr=>(r.setEnabled(t.selection.isEditable()),L(t,(s=>{r.setActive(b(s.parents,e)),r.setEnabled(!S(t,s.element)&&t.selection.isEditable())}))),D=(t,e)=>r=>L(t,(s=>r.setEnabled(b(s.parents,e)&&!S(t,s.element))));t.add("lists",(t=>((t=>{t.addCommand("mceListProps",(()=>{(t=>{const e=N(t);C(e)&&!S(t,e)&&t.windowManager.open({title:"List Properties",body:{type:"panel",items:[{type:"input",name:"start",label:"Start list at number",inputMode:"numeric"}]},initialData:{start:g({start:t.dom.getAttrib(e,"start","1"),listStyleType:o.from(t.dom.getStyle(e,"list-style-type"))})},buttons:[{type:"cancel",name:"cancel",text:"Cancel"},{type:"submit",name:"save",text:"Save",primary:!0}],onSubmit:e=>{(t=>{switch((t=>/^[0-9]+$/.test(t)?2:/^[A-Z]+$/.test(t)?0:/^[a-z]+$/.test(t)?1:t.length>0?4:3)(t)){case 2:return o.some({listStyleType:o.none(),start:t});case 0:return o.some({listStyleType:o.some("upper-alpha"),start:d(t).toString()});case 1:return o.some({listStyleType:o.some("lower-alpha"),start:d(t).toString()});case 3:return o.some({listStyleType:o.none(),start:""});case 4:return o.none()}})(e.getData().start).each((e=>{t.execCommand("mceListUpdate",!1,{attrs:{start:"1"===e.start?"":e.start},styles:{"list-style-type":e.listStyleType.getOr("")}})})),e.close()}})})(t)}))})(t),(t=>{const e=e=>()=>t.execCommand(e);t.hasPlugin("advlist")||(t.ui.registry.addToggleButton("numlist",{icon:"ordered-list",active:!1,tooltip:"Numbered list",onAction:e("InsertOrderedList"),onSetup:x(t,"OL")}),t.ui.registry.addToggleButton("bullist",{icon:"unordered-list",active:!1,tooltip:"Bullet list",onAction:e("InsertUnorderedList"),onSetup:x(t,"UL")}))})(t),(t=>{const e={text:"List properties...",icon:"ordered-list",onAction:()=>t.execCommand("mceListProps"),onSetup:D(t,"OL")};t.ui.registry.addMenuItem("listprops",e),t.ui.registry.addContextMenu("lists",{update:e=>{const r=N(t,e);return C(r)?["listprops"]:[]}})})(t),(t=>({backspaceDelete:e=>{t.execCommand("mceListBackspaceDelete",!1,e)}}))(t))))}(); \ No newline at end of file +!function(){"use strict";var t=tinymce.util.Tools.resolve("tinymce.PluginManager");const e=t=>({backspaceDelete:e=>{t.execCommand("mceListBackspaceDelete",!1,e)}}),s=t=>!(t=>null==t)(t),r=t=>"function"==typeof t;const n=(t,e)=>t===e,o=()=>false;class a{tag;value;static singletonNone=new a(!1);constructor(t,e){this.tag=t,this.value=e}static some(t){return new a(!0,t)}static none(){return a.singletonNone}fold(t,e){return this.tag?e(this.value):t()}isSome(){return this.tag}isNone(){return!this.tag}map(t){return this.tag?a.some(t(this.value)):a.none()}bind(t){return this.tag?t(this.value):a.none()}exists(t){return this.tag&&t(this.value)}forall(t){return!this.tag||t(this.value)}filter(t){return!this.tag||t(this.value)?this:a.none()}getOr(t){return this.tag?this.value:t}or(t){return this.tag?this:t}getOrThunk(t){return this.tag?this.value:t()}orThunk(t){return this.tag?this:t()}getOrDie(t){if(this.tag)return this.value;throw new Error(t??"Called getOrDie on None")}static from(t){return s(t)?a.some(t):a.none()}getOrNull(){return this.tag?this.value:null}getOrUndefined(){return this.value}each(t){this.tag&&t(this.value)}toArray(){return this.tag?[this.value]:[]}toString(){return this.tag?`some(${this.value})`:"none()"}}const i=Array.prototype.slice,l=(t,e,s)=>{for(let r=0,n=t.length;rt.exists(t=>s(t,e)),c=(d=/^\s+|\s+$/g,t=>t.replace(d,""));var d;const g=t=>{const e=(t=>{const e=i.call(t,0);return e.reverse(),e})(c(t).split("")),s=((t,e)=>{const s=t.length,r=new Array(s);for(let n=0;n{const s=t.toUpperCase().charCodeAt(0)-"A".charCodeAt(0)+1;return Math.pow(26,e)*s});return r=(t,e)=>t+e,n=0,((t,e)=>{for(let s=0,r=t.length;s{n=r(n,t)}),n;var r,n},m=t=>{if(--t<0)return"";{const e=t%26,s=Math.floor(t/26);return m(s)+String.fromCharCode("A".charCodeAt(0)+e)}},h=t=>{const e=parseInt(t.start,10);return u(t.listStyleType,"upper-alpha")?m(e):u(t.listStyleType,"lower-alpha")?m(e).toLowerCase():t.start},p=t=>t.options.get("forced_root_block");const y=t=>e=>s(e)&&t.test(e.nodeName),v=y(/^(OL|UL|DL)$/),f=y(/^(TH|TD)$/),L=y(/^(LI|DT|DD)$/),b=(t,e)=>l(t,v,f).exists(t=>t.nodeName===e&&!(t=>/\btox\-/.test(t.className))(t)),C=(t,e)=>{const s=t.selection.getNode();return e({parents:t.dom.getParents(s),element:s}),t.on("NodeChange",e),()=>t.off("NodeChange",e)},S=(t,e)=>{const s=t.dom.getParent(e,"ol,ul,dl");return((t,e)=>null!==e&&!t.dom.isEditable(e))(t,s)||!t.selection.isEditable()},A=t=>s(t)&&"ol"===t.nodeName.toLowerCase(),T=["OL","UL","DL"],N=T.join(","),w=(t,e)=>{const s=e||t.selection.getStart(!0);return t.dom.getParent(s,N,O(t,s,t.selection.isCollapsed()))},O=(t,e,s)=>{const r=t.dom.getParents(e,t.dom.isBlock),n=(a=e=>(!s||(e=>e.nodeName.toLowerCase()!==p(t))(e))&&x(t.schema,e),l(r,a,o));var a;return n.getOr(t.getBody())},x=(t,e)=>!v(e)&&!L(e)&&((t,e)=>{for(let s=0,r=t.length;st.isValidChild(e.nodeName,s)),D=(t,e)=>s=>(s.setEnabled(t.selection.isEditable()),C(t,r=>{s.setActive(b(r.parents,e)),s.setEnabled(!S(t,r.element)&&t.selection.isEditable())})),P=(t,e)=>s=>C(t,r=>s.setEnabled(b(r.parents,e)&&!S(t,r.element))),E="lists";t.add(E,t=>((t=>{t.addCommand("mceListProps",()=>{(t=>{const e=w(t);A(e)&&!S(t,e)&&t.windowManager.open({title:"List Properties",body:{type:"panel",items:[{type:"input",name:"start",label:"Start list at number",inputMode:"numeric"}]},initialData:{start:h({start:t.dom.getAttrib(e,"start","1"),listStyleType:a.from(t.dom.getStyle(e,"list-style-type"))})},buttons:[{type:"cancel",name:"cancel",text:"Cancel"},{type:"submit",name:"save",text:"Save",primary:!0}],onSubmit:e=>{(t=>{switch((t=>/^[0-9]+$/.test(t)?2:/^[A-Z]+$/.test(t)?0:/^[a-z]+$/.test(t)?1:t.length>0?4:3)(t)){case 2:return a.some({listStyleType:a.none(),start:t});case 0:return a.some({listStyleType:a.some("upper-alpha"),start:g(t).toString()});case 1:return a.some({listStyleType:a.some("lower-alpha"),start:g(t).toString()});case 3:return a.some({listStyleType:a.none(),start:""});case 4:return a.none()}})(e.getData().start).each(e=>{t.execCommand("mceListUpdate",!1,{attrs:{start:"1"===e.start?"":e.start},styles:{"list-style-type":e.listStyleType.getOr("")}})}),e.close()}})})(t)})})(t),(t=>{const e=e=>()=>t.execCommand(e);t.hasPlugin("advlist")||(t.ui.registry.addToggleButton("numlist",{icon:"ordered-list",active:!1,tooltip:"Numbered list",onAction:e("InsertOrderedList"),onSetup:D(t,"OL")}),t.ui.registry.addToggleButton("bullist",{icon:"unordered-list",active:!1,tooltip:"Bullet list",onAction:e("InsertUnorderedList"),onSetup:D(t,"UL")}))})(t),(t=>{const e={text:"List properties...",icon:"ordered-list",onAction:()=>t.execCommand("mceListProps"),onSetup:P(t,"OL")};t.ui.registry.addMenuItem("listprops",e),t.ui.registry.addContextMenu("lists",{update:e=>{const s=w(t,e);return A(s)?["listprops"]:[]}})})(t),{...e(t),getMetadata:()=>({name:"Lists",type:"opensource",slug:E})}))}(); \ No newline at end of file diff --git a/public/assets/tinymce/plugins/media/plugin.js b/public/assets/tinymce/plugins/media/plugin.js index a600ef8fa..8960ff759 100644 --- a/public/assets/tinymce/plugins/media/plugin.js +++ b/public/assets/tinymce/plugins/media/plugin.js @@ -1,5 +1,5 @@ /** - * TinyMCE version 8.1.2 (TBD) + * TinyMCE version 8.10.0 (2026-10-14) */ (function () { @@ -9,13 +9,12 @@ /* eslint-disable @typescript-eslint/no-wrapper-object-types */ const hasProto = (v, constructor, predicate) => { - var _a; if (predicate(v, constructor.prototype)) { return true; } else { // String-based fallback time - return ((_a = v.constructor) === null || _a === void 0 ? void 0 : _a.name) === constructor.name; + return v.constructor?.name === constructor.name; } }; const typeOf = (x) => { @@ -58,6 +57,11 @@ * strict-null-checks */ class Optional { + tag; + value; + // Sneaky optimisation: every instance of Optional.none is identical, so just + // reuse the same object + static singletonNone = new Optional(false); // The internal representation has a `tag` and a `value`, but both are // private: able to be console.logged, but not able to be accessed by code constructor(tag, value) { @@ -225,7 +229,7 @@ */ getOrDie(message) { if (!this.tag) { - throw new Error(message !== null && message !== void 0 ? message : 'Called getOrDie on None'); + throw new Error(message ?? 'Called getOrDie on None'); } else { return this.value; @@ -289,9 +293,6 @@ return this.tag ? `some(${this.value})` : 'none()'; } } - // Sneaky optimisation: every instance of Optional.none is identical, so just - // reuse the same object - Optional.singletonNone = new Optional(false); const nativeSlice = Array.prototype.slice; const nativePush = Array.prototype.push; @@ -474,7 +475,6 @@ }; const guess = (url) => { - var _a; const mimes = { mp3: 'audio/mpeg', m4a: 'audio/x-m4a', @@ -484,7 +484,7 @@ ogg: 'video/ogg', swf: 'application/x-shockwave-flash' }; - const fileEnd = (_a = url.toLowerCase().split('.').pop()) !== null && _a !== void 0 ? _a : ''; + const fileEnd = url.toLowerCase().split('.').pop() ?? ''; return get$1(mimes, fileEnd).getOr(''); }; @@ -731,10 +731,9 @@ } }; const dataToHtml = (editor, dataIn) => { - var _a; const data = global$5.extend({}, dataIn); if (!data.source) { - global$5.extend(data, htmlToData((_a = data.embed) !== null && _a !== void 0 ? _a : '', editor.schema)); + global$5.extend(data, htmlToData(data.embed ?? '', editor.schema)); if (!data.source) { return ''; } @@ -967,11 +966,10 @@ return hasDimensionsChanged(prevData, newData) && isEmbedIframe(newData.source, prevData.type); }; const submitForm = (prevData, newData, editor) => { - var _a; newData.embed = shouldInsertAsNewIframe(prevData, newData) && hasDimensions(editor) ? dataToHtml(editor, { ...newData, embed: '' }) - : updateHtml((_a = newData.embed) !== null && _a !== void 0 ? _a : '', newData, false, editor.schema); + : updateHtml(newData.embed ?? '', newData, false, editor.schema); // Only fetch the embed HTML content if the URL has changed from what it previously was if (newData.embed && (prevData.source === newData.source || isCached(newData.source))) { handleInsert(editor, newData.embed); @@ -998,9 +996,8 @@ } }; const handleEmbed = (api) => { - var _a; const data = unwrap(api.getData()); - const dataFromEmbed = htmlToData((_a = data.embed) !== null && _a !== void 0 ? _a : '', editor.schema); + const dataFromEmbed = htmlToData(data.embed ?? '', editor.schema); api.setData(wrap(dataFromEmbed)); }; const handleUpdate = (api, sourceInput, prevData) => { @@ -1184,7 +1181,6 @@ return placeHolder; }; const createPreviewNode = (editor, node) => { - var _a; const name = node.name; const previewWrapper = new global$2('span', 1); previewWrapper.attr({ @@ -1194,7 +1190,7 @@ 'class': 'mce-preview-object mce-object-' + name }); retainAttributesAndInnerHtml(editor, node, previewWrapper); - const styles = editor.dom.parseStyle((_a = node.attr('style')) !== null && _a !== void 0 ? _a : ''); + const styles = editor.dom.parseStyle(node.attr('style') ?? ''); const previewNode = new global$2(name, 1); setDimensions(node, previewNode, styles); previewNode.attr({ @@ -1229,10 +1225,9 @@ return previewWrapper; }; const retainAttributesAndInnerHtml = (editor, sourceNode, targetNode) => { - var _a; // Prefix all attributes except internal (data-mce-*), width, height and style since we // will add these to the placeholder - const attribs = (_a = sourceNode.attributes) !== null && _a !== void 0 ? _a : []; + const attribs = sourceNode.attributes ?? []; let ai = attribs.length; while (ai--) { const attrName = attribs[ai].name; @@ -1292,13 +1287,83 @@ } }; - const parseAndSanitize = (editor, context, html) => { + const parseAndSanitize = (editor, html) => { const getEditorOption = editor.options.get; const sanitize = getEditorOption('xss_sanitization'); const validate = shouldFilterHtml(editor); - return Parser(editor.schema, { sanitize, validate }).parse(html, { context }); + return Parser(editor.schema, { sanitize, validate }).parse(html); }; + let nonNonScriptingDocument; + const createNonScriptingDocument = () => { + if (isNonNullable(nonNonScriptingDocument)) { + return nonNonScriptingDocument; + } + nonNonScriptingDocument = new DOMParser().parseFromString('', 'text/html'); + return nonNonScriptingDocument; + }; + const buildMediaElement = (editor, node) => { + const doc = createNonScriptingDocument(); + const realElmName = node.attr('data-mce-object'); + const element = doc.createElement(realElmName); + // Add width/height to everything but audio + if (realElmName !== 'audio') { + const className = node.attr('class'); + const firstChild = node.firstChild; + if (className && className.indexOf('mce-preview-object') !== -1 && firstChild) { + const width = firstChild.attr('width'); + const height = firstChild.attr('height'); + if (isString(width)) { + element.setAttribute('width', width); + } + if (isString(height)) { + element.setAttribute('height', height); + } + } + else { + const width = node.attr('width'); + const height = node.attr('height'); + if (isString(width)) { + element.setAttribute('width', width); + } + if (isString(height)) { + element.setAttribute('height', height); + } + } + } + const style = node.attr('style'); + if (isString(style)) { + element.setAttribute('style', style); + } + // Unprefix all placeholder attributes + const attribs = node.attributes ?? []; + let ai = attribs.length; + while (ai--) { + const attrName = attribs[ai].name; + if (attrName.indexOf('data-mce-p-') === 0) { + element.setAttribute(attrName.substr(11), attribs[ai].value); + } + } + // Inject innerhtml + const innerHtml = node.attr('data-mce-html'); + if (isString(innerHtml)) { + element.innerHTML = unescape(innerHtml); + } + else { + element.innerHTML = '\u00a0'; + } + const fragment = parseAndSanitize(editor, element.outerHTML); + const newElement = fragment.getAll(realElmName)[0]; + if (isNonNullable(newElement)) { + if (!isString(innerHtml)) { + newElement.empty(); + } + return Optional.some(newElement); + } + else { + return Optional.none(); + } + }; const setup$1 = (editor) => { editor.on('PreInit', () => { const { schema, serializer, parser } = editor; @@ -1322,51 +1387,14 @@ // Converts iframe, video etc into placeholder images parser.addNodeFilter('iframe,video,audio,object,embed', placeHolderConverter(editor)); // Replaces placeholder images with real elements for video, object, iframe etc - serializer.addAttributeFilter('data-mce-object', (nodes, name) => { - var _a; + serializer.addAttributeFilter('data-mce-object', (nodes) => { let i = nodes.length; while (i--) { const node = nodes[i]; if (!node.parent) { continue; } - const realElmName = node.attr(name); - const realElm = new global$2(realElmName, 1); - // Add width/height to everything but audio - if (realElmName !== 'audio') { - const className = node.attr('class'); - if (className && className.indexOf('mce-preview-object') !== -1 && node.firstChild) { - realElm.attr({ - width: node.firstChild.attr('width'), - height: node.firstChild.attr('height') - }); - } - else { - realElm.attr({ - width: node.attr('width'), - height: node.attr('height') - }); - } - } - realElm.attr({ - style: node.attr('style') - }); - // Unprefix all placeholder attributes - const attribs = (_a = node.attributes) !== null && _a !== void 0 ? _a : []; - let ai = attribs.length; - while (ai--) { - const attrName = attribs[ai].name; - if (attrName.indexOf('data-mce-p-') === 0) { - realElm.attr(attrName.substr(11), attribs[ai].value); - } - } - // Inject innerhtml - const innerHtml = node.attr('data-mce-html'); - if (innerHtml) { - const fragment = parseAndSanitize(editor, realElmName, unescape(innerHtml)); - each$1(fragment.children(), (child) => realElm.append(child)); - } - node.replace(realElm); + buildMediaElement(editor, node).fold(() => node.remove(), (realElm) => node.replace(realElm)); } }); }); @@ -1426,15 +1454,19 @@ }); }; + const PLUGIN_CODE = 'media'; var Plugin = () => { - global$6.add('media', (editor) => { + global$6.add(PLUGIN_CODE, (editor) => { register$2(editor); register$1(editor); register(editor); setup(editor); setup$1(editor); setup$2(editor); - return get(editor); + return { + ...get(editor), + getMetadata: () => ({ name: 'Media', type: 'opensource', slug: PLUGIN_CODE }) + }; }); }; diff --git a/public/assets/tinymce/plugins/media/plugin.min.js b/public/assets/tinymce/plugins/media/plugin.min.js index 77bbb2edf..013d8562e 100644 --- a/public/assets/tinymce/plugins/media/plugin.min.js +++ b/public/assets/tinymce/plugins/media/plugin.min.js @@ -1 +1 @@ -!function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager");const t=e=>t=>(e=>{const t=typeof e;return null===e?"null":"object"===t&&Array.isArray(e)?"array":"object"===t&&(r=o=e,(a=String).prototype.isPrototypeOf(r)||(null===(s=o.constructor)||void 0===s?void 0:s.name)===a.name)?"string":t;var r,o,a,s})(t)===e,r=t("string"),o=t("object"),a=t("array"),s=e=>!(e=>null==e)(e),i=e=>"function"==typeof e;class n{constructor(e,t){this.tag=e,this.value=t}static some(e){return new n(!0,e)}static none(){return n.singletonNone}fold(e,t){return this.tag?t(this.value):e()}isSome(){return this.tag}isNone(){return!this.tag}map(e){return this.tag?n.some(e(this.value)):n.none()}bind(e){return this.tag?e(this.value):n.none()}exists(e){return this.tag&&e(this.value)}forall(e){return!this.tag||e(this.value)}filter(e){return!this.tag||e(this.value)?this:n.none()}getOr(e){return this.tag?this.value:e}or(e){return this.tag?this:e}getOrThunk(e){return this.tag?this.value:e()}orThunk(e){return this.tag?this:e()}getOrDie(e){if(this.tag)return this.value;throw new Error(null!=e?e:"Called getOrDie on None")}static from(e){return s(e)?n.some(e):n.none()}getOrNull(){return this.tag?this.value:null}getOrUndefined(){return this.value}each(e){this.tag&&e(this.value)}toArray(){return this.tag?[this.value]:[]}toString(){return this.tag?`some(${this.value})`:"none()"}}n.singletonNone=new n(!1),Array.prototype.slice;const l=Array.prototype.push,c=(e,t)=>{for(let r=0,o=e.length;r{const t=[];for(let r=0,o=e.length;rp(e,t)?n.from(e[t]):n.none(),p=(e,t)=>d.call(e,t),g=e=>t=>t.options.get(e),b=g("audio_template_callback"),w=g("video_template_callback"),f=g("iframe_template_callback"),v=g("media_live_embeds"),y=g("media_filter_html"),x=g("media_url_resolver"),_=g("media_alt_source"),k=g("media_poster"),j=g("media_dimensions");var A=tinymce.util.Tools.resolve("tinymce.util.Tools"),O=tinymce.util.Tools.resolve("tinymce.dom.DOMUtils"),S=tinymce.util.Tools.resolve("tinymce.html.DomParser");const $=O.DOM,C=e=>e.replace(/px$/,""),T=e=>{const t=e.attr("style"),r=t?$.parseStyle(t):{};return{type:"ephox-embed-iri",source:e.attr("data-ephox-embed-iri"),altsource:"",poster:"",width:h(r,"max-width").map(C).getOr(""),height:h(r,"max-height").map(C).getOr("")}},z=(e,t)=>{let r={};for(let o=S({validate:!1,forced_root_block:!1},t).parse(e);o;o=o.walk())if(1===o.type){const e=o.name;if(o.attr("data-ephox-embed-iri")){r=T(o);break}r.source||"param"!==e||(r.source=o.attr("movie")),"iframe"!==e&&"object"!==e&&"embed"!==e&&"video"!==e&&"audio"!==e||(r.type||(r.type=e),r=A.extend(o.attributes.map,r)),"source"===e&&(r.source?r.altsource||(r.altsource=o.attr("src")):r.source=o.attr("src")),"img"!==e||r.poster||(r.poster=o.attr("src"))}return r.source=r.source||r.src||"",r.altsource=r.altsource||"",r.poster=r.poster||"",r},D=e=>{var t;const r=null!==(t=e.toLowerCase().split(".").pop())&&void 0!==t?t:"";return h({mp3:"audio/mpeg",m4a:"audio/x-m4a",wav:"audio/wav",mp4:"video/mp4",webm:"video/webm",ogg:"video/ogg",swf:"application/x-shockwave-flash"},r).getOr("")};var F=tinymce.util.Tools.resolve("tinymce.html.Node"),M=tinymce.util.Tools.resolve("tinymce.html.Serializer");const N=(e,t={})=>S({forced_root_block:!1,validate:!1,allow_conditional_comments:!0,...t},e),P=O.DOM,R=e=>/^[0-9.]+$/.test(e)?e+"px":e,E=(e,t)=>{const r=t.attr("style"),o=r?P.parseStyle(r):{};s(e.width)&&(o["max-width"]=R(e.width)),s(e.height)&&(o["max-height"]=R(e.height)),t.attr("style",P.serializeStyle(o))},U=["source","altsource"],L=(e,t,r,o)=>{let a=0,s=0;const i=N(o);i.addNodeFilter("source",(e=>a=e.length));const n=i.parse(e);for(let e=n;e;e=e.walk())if(1===e.type){const o=e.name;if(e.attr("data-ephox-embed-iri")){E(t,e);break}switch(o){case"video":case"object":case"embed":case"img":case"iframe":void 0!==t.height&&void 0!==t.width&&(e.attr("width",t.width),e.attr("height",t.height))}if(r)switch(o){case"video":e.attr("poster",t.poster),e.attr("src",null);for(let r=a;r<2;r++)if(t[U[r]]){const o=new F("source",1);o.attr("src",t[U[r]]),o.attr("type",t[U[r]+"mime"]||null),e.append(o)}break;case"iframe":e.attr("src",t.source);break;case"object":const r=e.getAll("img").length>0;if(t.poster&&!r){e.attr("src",t.poster);const r=new F("img",1);r.attr("src",t.poster),r.attr("width",t.width),r.attr("height",t.height),e.append(r)}break;case"source":if(s<2&&(e.attr("src",t[U[s]]),e.attr("type",t[U[s]+"mime"]||null),!t[U[s]])){e.remove();continue}s++;break;case"img":t.poster||e.remove()}}return M({},o).serialize(n)},I=[{regex:/youtu\.be\/([\w\-_\?&=.]+)/i,type:"iframe",w:560,h:314,url:"www.youtube.com/embed/$1",allowFullscreen:!0},{regex:/youtube\.com(.+)v=([^&]+)(&([a-z0-9&=\-_]+))?/i,type:"iframe",w:560,h:314,url:"www.youtube.com/embed/$2?$4",allowFullscreen:!0},{regex:/youtube.com\/embed\/([a-z0-9\?&=\-_]+)/i,type:"iframe",w:560,h:314,url:"www.youtube.com/embed/$1",allowFullscreen:!0},{regex:/vimeo\.com\/([0-9]+)\?h=(\w+)/,type:"iframe",w:425,h:350,url:"player.vimeo.com/video/$1?h=$2&title=0&byline=0&portrait=0&color=8dc7dc",allowFullscreen:!0},{regex:/vimeo\.com\/(.*)\/([0-9]+)\?h=(\w+)/,type:"iframe",w:425,h:350,url:"player.vimeo.com/video/$2?h=$3&title=0&byline=0",allowFullscreen:!0},{regex:/vimeo\.com\/([0-9]+)/,type:"iframe",w:425,h:350,url:"player.vimeo.com/video/$1?title=0&byline=0&portrait=0&color=8dc7dc",allowFullscreen:!0},{regex:/vimeo\.com\/(.*)\/([0-9]+)/,type:"iframe",w:425,h:350,url:"player.vimeo.com/video/$2?title=0&byline=0",allowFullscreen:!0},{regex:/maps\.google\.([a-z]{2,3})\/maps\/(.+)msid=(.+)/,type:"iframe",w:425,h:350,url:'maps.google.com/maps/ms?msid=$2&output=embed"',allowFullscreen:!1},{regex:/dailymotion\.com\/video\/([^_]+)/,type:"iframe",w:480,h:270,url:"www.dailymotion.com/embed/video/$1",allowFullscreen:!0},{regex:/dai\.ly\/([^_]+)/,type:"iframe",w:480,h:270,url:"www.dailymotion.com/embed/video/$1",allowFullscreen:!0}],B=(e,t)=>{const r=(e=>{const t=e.match(/^(https?:\/\/|www\.)(.+)$/i);return t&&t.length>1?"www."===t[1]?"https://":t[1]:"https://"})(t),o=e.regex.exec(t);let a=r+e.url;if(s(o))for(let e=0;eo[e]?o[e]:""));return a.replace(/\?$/,"")},G=e=>{const t=I.filter((t=>t.regex.test(e)));return t.length>0?A.extend({},t[0],{url:B(t[0],e)}):null},W=(e,t)=>{var r;const o=A.extend({},t);if(!o.source&&(A.extend(o,z(null!==(r=o.embed)&&void 0!==r?r:"",e.schema)),!o.source))return"";o.altsource||(o.altsource=""),o.poster||(o.poster=""),o.source=e.convertURL(o.source,"source"),o.altsource=e.convertURL(o.altsource,"source"),o.sourcemime=D(o.source),o.altsourcemime=D(o.altsource),o.poster=e.convertURL(o.poster,"poster");const a=G(o.source);if(a&&(o.source=a.url,o.type=a.type,o.allowfullscreen=a.allowFullscreen,o.width=o.width||String(a.w),o.height=o.height||String(a.h)),o.embed)return L(o.embed,o,!0,e.schema);{const t=b(e),r=w(e),a=f(e);return o.width=o.width||"300",o.height=o.height||"150",A.each(o,((t,r)=>{o[r]=e.dom.encode(""+t)})),"iframe"===o.type?((e,t)=>{if(t)return t(e);{const t=e.allowfullscreen?' allowFullscreen="1"':"";return'"}})(o,a):"application/x-shockwave-flash"===o.sourcemime?(e=>{let t='';return e.poster&&(t+=''),t+="",t})(o):-1!==o.sourcemime.indexOf("audio")?((e,t)=>t?t(e):'")(o,t):((e,t)=>t?t(e):'")(o,r)}},q=e=>e.hasAttribute("data-mce-object")||e.hasAttribute("data-ephox-embed-iri"),H={},J=e=>t=>W(e,t),K=(e,t)=>{const r=x(e);return r?((e,t,r)=>new Promise(((o,a)=>{const s=r=>(r.html&&(H[e.source]=r),o({url:e.source,html:r.html?r.html:t(e)}));H[e.source]?s(H[e.source]):r({url:e.source}).then(s).catch(a)})))(t,J(e),r):((e,t)=>Promise.resolve({html:t(e),url:e.source}))(t,J(e))},Q=(e,t)=>{const r={};return h(e,"dimensions").each((e=>{c(["width","height"],(o=>{h(t,o).orThunk((()=>h(e,o))).each((e=>r[o]=e))}))})),r},V=(e,t)=>{const r=t&&"dimensions"!==t?((e,t)=>h(t,e).bind((e=>h(e,"meta"))))(t,e).getOr({}):{},a=((e,t,r)=>a=>{const s=()=>h(e,a),i=()=>h(t,a),l=e=>h(e,"value").bind((e=>e.length>0?n.some(e):n.none()));return{[a]:(a===r?s().bind((e=>o(e)?l(e).orThunk(i):i().orThunk((()=>n.from(e))))):i().orThunk((()=>s().bind((e=>o(e)?l(e):n.from(e)))))).getOr("")}})(e,r,t);return{...a("source"),...a("altsource"),...a("poster"),...a("embed"),...Q(e,r)}},X=e=>{const t={...e,source:{value:h(e,"source").getOr("")},altsource:{value:h(e,"altsource").getOr("")},poster:{value:h(e,"poster").getOr("")}};return c(["width","height"],(r=>{h(e,r).each((e=>{const o=t.dimensions||{};o[r]=e,t.dimensions=o}))})),t},Y=e=>t=>{const r=t&&t.msg?"Media embed handler error: "+t.msg:"Media embed handler threw unknown error.";e.notificationManager.open({type:"error",text:r})},Z=(e,t)=>o=>{if(r(o.url)&&o.url.trim().length>0){const r=o.html,a={...z(r,t.schema),source:o.url,embed:r};e.setData(X(a))}},ee=(e,t)=>{const r=e.dom.select("*[data-mce-object]");e.insertContent(t),((e,t)=>{const r=e.dom.select("*[data-mce-object]");for(let e=0;e=0;o--)t[e]===r[o]&&r.splice(o,1);e.selection.select(r[0])})(e,r),e.nodeChanged()},te=(e,t)=>s(t)&&"ephox-embed-iri"===t&&s(G(e)),re=(e,t)=>((e,t)=>e.width!==t.width||e.height!==t.height)(e,t)&&te(t.source,e.type),oe=e=>{const t=(e=>{const t=e.selection.getNode(),r=q(t)?e.serializer.serialize(t,{selection:!0}):"",o=z(r,e.schema),a=(()=>{if(te(o.source,o.type)){const r=e.dom.getRect(t);return{width:r.w.toString().replace(/px$/,""),height:r.h.toString().replace(/px$/,"")}}return{}})();return{embed:r,...o,...a}})(e),r=(e=>{let t=e;return{get:()=>t,set:e=>{t=e}}})(t),o=X(t),a=j(e)?[{type:"sizeinput",name:"dimensions",label:"Constrain proportions",constrain:!0}]:[],s={title:"General",name:"general",items:m([[{name:"source",type:"urlinput",filetype:"media",label:"Source",picker_text:"Browse files"}],a])},i=[];_(e)&&i.push({name:"altsource",type:"urlinput",filetype:"media",label:"Alternative source URL"}),k(e)&&i.push({name:"poster",type:"urlinput",filetype:"image",label:"Media poster (Image URL)"});const n={title:"Advanced",name:"advanced",items:i},l=[s,{title:"Embed",items:[{type:"textarea",name:"embed",label:"Paste your embed code below:"}]}];i.length>0&&l.push(n);const c={type:"tabpanel",tabs:l},u=e.windowManager.open({title:"Insert/Edit Media",size:"normal",body:c,buttons:[{type:"cancel",name:"cancel",text:"Cancel"},{type:"submit",name:"save",text:"Save",primary:!0}],onSubmit:t=>{const o=V(t.getData());((e,t,r)=>{var o,a;t.embed=re(e,t)&&j(r)?W(r,{...t,embed:""}):L(null!==(o=t.embed)&&void 0!==o?o:"",t,!1,r.schema),t.embed&&(e.source===t.source||(a=t.source,p(H,a)))?ee(r,t.embed):K(r,t).then((e=>{ee(r,e.html)})).catch(Y(r))})(r.get(),o,e),t.close()},onChange:(t,o)=>{switch(o.name){case"source":((t,r)=>{const o=V(r.getData(),"source");t.source!==o.source&&(Z(u,e)({url:o.source,html:""}),K(e,o).then(Z(u,e)).catch(Y(e)))})(r.get(),t);break;case"embed":(t=>{var r;const o=V(t.getData()),a=z(null!==(r=o.embed)&&void 0!==r?r:"",e.schema);t.setData(X(a))})(t);break;case"dimensions":case"altsource":case"poster":((t,r,o)=>{const a=V(t.getData(),r),s=re(o,a)&&j(e)?{...a,embed:""}:a,i=W(e,s);t.setData(X({...s,embed:i}))})(t,o.name,r.get())}r.set(V(t.getData()))},initialData:o})};var ae=tinymce.util.Tools.resolve("tinymce.Env");const se=e=>{const t=e.name;return"iframe"===t||"video"===t||"audio"===t},ie=(e,t,r,o=null)=>{const a=e.attr(r);return s(a)?a:p(t,r)?null:o},ne=(e,t,r)=>{const o="img"===t.name||"video"===e.name,a=o?"300":null,s="audio"===e.name?"30":"150",i=o?s:null;t.attr({width:ie(e,r,"width",a),height:ie(e,r,"height",i)})},le=(e,t)=>{const r=t.name,o=new F("img",1);return me(e,t,o),ne(t,o,{}),o.attr({style:t.attr("style"),src:ae.transparentSrc,"data-mce-object":r,class:"mce-object mce-object-"+r}),o},ce=(e,t)=>{var r;const o=t.name,a=new F("span",1);a.attr({contentEditable:"false",style:t.attr("style"),"data-mce-object":o,class:"mce-preview-object mce-object-"+o}),me(e,t,a);const i=e.dom.parseStyle(null!==(r=t.attr("style"))&&void 0!==r?r:""),n=new F(o,1);if(ne(t,n,i),n.attr({src:t.attr("src"),style:t.attr("style"),class:t.attr("class")}),"iframe"===o)n.attr({allowfullscreen:t.attr("allowfullscreen"),frameborder:"0",sandbox:t.attr("sandbox"),referrerpolicy:t.attr("referrerpolicy")});else{c(["controls","crossorigin","currentTime","loop","muted","poster","preload"],(e=>{n.attr(e,t.attr(e))}));const r=a.attr("data-mce-html");s(r)&&((e,t,r,o)=>{const a=N(e.schema).parse(o,{context:t});for(;a.firstChild;)r.append(a.firstChild)})(e,o,n,unescape(r))}const l=new F("span",1);return l.attr("class","mce-shim"),a.append(n),a.append(l),a},me=(e,t,r)=>{var o;const a=null!==(o=t.attributes)&&void 0!==o?o:[];let s=a.length;for(;s--;){const t=a[s].name;let o=a[s].value;"width"===t||"height"===t||"style"===t||(n="data-mce-",(i=t).length>=9&&i.substr(0,9)===n)||("data"!==t&&"src"!==t||(o=e.convertURL(o,t)),r.attr("data-mce-p-"+t,o))}var i,n;const l=M({inner:!0},e.schema),m=new F("div",1);c(t.children(),(e=>m.append(e)));const u=l.serialize(m);u&&(r.attr("data-mce-html",escape(u)),r.empty())},ue=e=>{const t=e.attr("class");return r(t)&&/\btiny-pageembed\b/.test(t)},de=e=>{let t=e;for(;t=t.parent;)if(t.attr("data-ephox-embed-iri")||ue(t))return!0;return!1},he=(e,t,r)=>{const o=(0,e.options.get)("xss_sanitization"),a=y(e);return N(e.schema,{sanitize:o,validate:a}).parse(r,{context:t})},pe=e=>t=>{const r=()=>{t.setEnabled(e.selection.isEditable())};return e.on("NodeChange",r),r(),()=>{e.off("NodeChange",r)}};e.add("media",(e=>((e=>{const t=e.options.register;t("audio_template_callback",{processor:"function"}),t("video_template_callback",{processor:"function"}),t("iframe_template_callback",{processor:"function"}),t("media_live_embeds",{processor:"boolean",default:!0}),t("media_filter_html",{processor:"boolean",default:!0}),t("media_url_resolver",{processor:"function"}),t("media_alt_source",{processor:"boolean",default:!0}),t("media_poster",{processor:"boolean",default:!0}),t("media_dimensions",{processor:"boolean",default:!0})})(e),(e=>{e.addCommand("mceMedia",(()=>{oe(e)}))})(e),(e=>{const t=()=>e.execCommand("mceMedia");e.ui.registry.addToggleButton("media",{tooltip:"Insert/edit media",icon:"embed",onAction:t,onSetup:t=>{const r=e.selection;t.setActive(q(r.getNode()));const o=r.selectorChangedWithUnbind("img[data-mce-object],span[data-mce-object],div[data-ephox-embed-iri]",t.setActive).unbind,a=pe(e)(t);return()=>{o(),a()}}}),e.ui.registry.addMenuItem("media",{icon:"embed",text:"Media...",onAction:t,onSetup:pe(e)})})(e),(e=>{e.on("ResolveName",(e=>{let t;1===e.target.nodeType&&(t=e.target.getAttribute("data-mce-object"))&&(e.name=t)}))})(e),(e=>{e.on("PreInit",(()=>{const{schema:t,serializer:r,parser:o}=e,a=t.getBoolAttrs();c("webkitallowfullscreen mozallowfullscreen".split(" "),(e=>{a[e]={}})),((e,t)=>{const r=u(e);for(let o=0,a=r.length;o{const o=t.getElementRule(r);o&&c(e,(e=>{o.attributes[e]={},o.attributesOrder.push(e)}))})),o.addNodeFilter("iframe,video,audio,object,embed",(e=>t=>{let r,o=t.length;for(;o--;)r=t[o],r.parent&&(r.parent.attr("data-mce-object")||(se(r)&&v(e)?de(r)||r.replace(ce(e,r)):de(r)||r.replace(le(e,r))))})(e)),r.addAttributeFilter("data-mce-object",((t,r)=>{var o;let a=t.length;for(;a--;){const s=t[a];if(!s.parent)continue;const i=s.attr(r),n=new F(i,1);if("audio"!==i){const e=s.attr("class");e&&-1!==e.indexOf("mce-preview-object")&&s.firstChild?n.attr({width:s.firstChild.attr("width"),height:s.firstChild.attr("height")}):n.attr({width:s.attr("width"),height:s.attr("height")})}n.attr({style:s.attr("style")});const l=null!==(o=s.attributes)&&void 0!==o?o:[];let m=l.length;for(;m--;){const e=l[m].name;0===e.indexOf("data-mce-p-")&&n.attr(e.substr(11),l[m].value)}const u=s.attr("data-mce-html");if(u){const t=he(e,i,unescape(u));c(t.children(),(e=>n.append(e)))}s.replace(n)}}))})),e.on("SetContent",(()=>{const t=e.dom;c(t.select("span.mce-preview-object"),(e=>{0===t.select("span.mce-shim",e).length&&t.add(e,"span",{class:"mce-shim"})}))}))})(e),(e=>{e.on("mousedown",(t=>{const r=e.dom.getParent(t.target,".mce-preview-object");r&&"2"===e.dom.getAttrib(r,"data-mce-selected")&&t.stopImmediatePropagation()})),e.on("click keyup touchend",(()=>{const t=e.selection.getNode();t&&e.dom.hasClass(t,"mce-preview-object")&&e.dom.getAttrib(t,"data-mce-selected")&&t.setAttribute("data-mce-selected","2")})),e.on("ObjectResized",(t=>{const r=t.target;if(r.getAttribute("data-mce-object")){let o=r.getAttribute("data-mce-html");o&&(o=unescape(o),r.setAttribute("data-mce-html",escape(L(o,{width:String(t.width),height:String(t.height)},!1,e.schema))))}}))})(e),(e=>({showDialog:()=>{oe(e)}}))(e))))}(); \ No newline at end of file +!function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager");const t=e=>t=>(e=>{const t=typeof e;return null===e?"null":"object"===t&&Array.isArray(e)?"array":"object"===t&&(r=o=e,(a=String).prototype.isPrototypeOf(r)||o.constructor?.name===a.name)?"string":t;var r,o,a})(t)===e,r=t("string"),o=t("object"),a=t("array"),s=e=>!(e=>null==e)(e),i=e=>"function"==typeof e;class n{tag;value;static singletonNone=new n(!1);constructor(e,t){this.tag=e,this.value=t}static some(e){return new n(!0,e)}static none(){return n.singletonNone}fold(e,t){return this.tag?t(this.value):e()}isSome(){return this.tag}isNone(){return!this.tag}map(e){return this.tag?n.some(e(this.value)):n.none()}bind(e){return this.tag?e(this.value):n.none()}exists(e){return this.tag&&e(this.value)}forall(e){return!this.tag||e(this.value)}filter(e){return!this.tag||e(this.value)?this:n.none()}getOr(e){return this.tag?this.value:e}or(e){return this.tag?this:e}getOrThunk(e){return this.tag?this.value:e()}orThunk(e){return this.tag?this:e()}getOrDie(e){if(this.tag)return this.value;throw new Error(e??"Called getOrDie on None")}static from(e){return s(e)?n.some(e):n.none()}getOrNull(){return this.tag?this.value:null}getOrUndefined(){return this.value}each(e){this.tag&&e(this.value)}toArray(){return this.tag?[this.value]:[]}toString(){return this.tag?`some(${this.value})`:"none()"}}Array.prototype.slice;const c=Array.prototype.push,l=(e,t)=>{for(let r=0,o=e.length;r{const t=[];for(let r=0,o=e.length;rp(e,t)?n.from(e[t]):n.none(),p=(e,t)=>d.call(e,t),g=(e,t)=>((e,t)=>""===t||e.length>=t.length&&e.substr(0,0+t.length)===t)(e,t),b=e=>t=>t.options.get(e),w=b("audio_template_callback"),y=b("video_template_callback"),f=b("iframe_template_callback"),v=b("media_live_embeds"),x=b("media_filter_html"),_=b("media_url_resolver"),k=b("media_alt_source"),A=b("media_poster"),j=b("media_dimensions");var O=tinymce.util.Tools.resolve("tinymce.util.Tools"),S=tinymce.util.Tools.resolve("tinymce.dom.DOMUtils"),$=tinymce.util.Tools.resolve("tinymce.html.DomParser");const M=S.DOM,T=e=>e.replace(/px$/,""),C=e=>{const t=e.attr("style"),r=t?M.parseStyle(t):{};return{type:"ephox-embed-iri",source:e.attr("data-ephox-embed-iri"),altsource:"",poster:"",width:h(r,"max-width").map(T).getOr(""),height:h(r,"max-height").map(T).getOr("")}},D=(e,t)=>{let r={};for(let o=$({validate:!1,forced_root_block:!1},t).parse(e);o;o=o.walk())if(1===o.type){const e=o.name;if(o.attr("data-ephox-embed-iri")){r=C(o);break}r.source||"param"!==e||(r.source=o.attr("movie")),"iframe"!==e&&"object"!==e&&"embed"!==e&&"video"!==e&&"audio"!==e||(r.type||(r.type=e),r=O.extend(o.attributes.map,r)),"source"===e&&(r.source?r.altsource||(r.altsource=o.attr("src")):r.source=o.attr("src")),"img"!==e||r.poster||(r.poster=o.attr("src"))}return r.source=r.source||r.src||"",r.altsource=r.altsource||"",r.poster=r.poster||"",r},z=e=>{const t=e.toLowerCase().split(".").pop()??"";return h({mp3:"audio/mpeg",m4a:"audio/x-m4a",wav:"audio/wav",mp4:"video/mp4",webm:"video/webm",ogg:"video/ogg",swf:"application/x-shockwave-flash"},t).getOr("")};var F=tinymce.util.Tools.resolve("tinymce.html.Node"),N=tinymce.util.Tools.resolve("tinymce.html.Serializer");const P=(e,t={})=>$({forced_root_block:!1,validate:!1,allow_conditional_comments:!0,...t},e),E=S.DOM,L=e=>/^[0-9.]+$/.test(e)?e+"px":e,R=(e,t)=>{const r=t.attr("style"),o=r?E.parseStyle(r):{};s(e.width)&&(o["max-width"]=L(e.width)),s(e.height)&&(o["max-height"]=L(e.height)),t.attr("style",E.serializeStyle(o))},U=["source","altsource"],I=(e,t,r,o)=>{let a=0,s=0;const i=P(o);i.addNodeFilter("source",e=>a=e.length);const n=i.parse(e);for(let e=n;e;e=e.walk())if(1===e.type){const o=e.name;if(e.attr("data-ephox-embed-iri")){R(t,e);break}switch(o){case"video":case"object":case"embed":case"img":case"iframe":void 0!==t.height&&void 0!==t.width&&(e.attr("width",t.width),e.attr("height",t.height))}if(r)switch(o){case"video":e.attr("poster",t.poster),e.attr("src",null);for(let r=a;r<2;r++)if(t[U[r]]){const o=new F("source",1);o.attr("src",t[U[r]]),o.attr("type",t[U[r]+"mime"]||null),e.append(o)}break;case"iframe":e.attr("src",t.source);break;case"object":const r=e.getAll("img").length>0;if(t.poster&&!r){e.attr("src",t.poster);const r=new F("img",1);r.attr("src",t.poster),r.attr("width",t.width),r.attr("height",t.height),e.append(r)}break;case"source":if(s<2&&(e.attr("src",t[U[s]]),e.attr("type",t[U[s]+"mime"]||null),!t[U[s]])){e.remove();continue}s++;break;case"img":t.poster||e.remove()}}return N({},o).serialize(n)},B=[{regex:/youtu\.be\/([\w\-_\?&=.]+)/i,type:"iframe",w:560,h:314,url:"www.youtube.com/embed/$1",allowFullscreen:!0},{regex:/youtube\.com(.+)v=([^&]+)(&([a-z0-9&=\-_]+))?/i,type:"iframe",w:560,h:314,url:"www.youtube.com/embed/$2?$4",allowFullscreen:!0},{regex:/youtube.com\/embed\/([a-z0-9\?&=\-_]+)/i,type:"iframe",w:560,h:314,url:"www.youtube.com/embed/$1",allowFullscreen:!0},{regex:/vimeo\.com\/([0-9]+)\?h=(\w+)/,type:"iframe",w:425,h:350,url:"player.vimeo.com/video/$1?h=$2&title=0&byline=0&portrait=0&color=8dc7dc",allowFullscreen:!0},{regex:/vimeo\.com\/(.*)\/([0-9]+)\?h=(\w+)/,type:"iframe",w:425,h:350,url:"player.vimeo.com/video/$2?h=$3&title=0&byline=0",allowFullscreen:!0},{regex:/vimeo\.com\/([0-9]+)/,type:"iframe",w:425,h:350,url:"player.vimeo.com/video/$1?title=0&byline=0&portrait=0&color=8dc7dc",allowFullscreen:!0},{regex:/vimeo\.com\/(.*)\/([0-9]+)/,type:"iframe",w:425,h:350,url:"player.vimeo.com/video/$2?title=0&byline=0",allowFullscreen:!0},{regex:/maps\.google\.([a-z]{2,3})\/maps\/(.+)msid=(.+)/,type:"iframe",w:425,h:350,url:'maps.google.com/maps/ms?msid=$2&output=embed"',allowFullscreen:!1},{regex:/dailymotion\.com\/video\/([^_]+)/,type:"iframe",w:480,h:270,url:"www.dailymotion.com/embed/video/$1",allowFullscreen:!0},{regex:/dai\.ly\/([^_]+)/,type:"iframe",w:480,h:270,url:"www.dailymotion.com/embed/video/$1",allowFullscreen:!0}],H=(e,t)=>{const r=(e=>{const t=e.match(/^(https?:\/\/|www\.)(.+)$/i);return t&&t.length>1?"www."===t[1]?"https://":t[1]:"https://"})(t),o=e.regex.exec(t);let a=r+e.url;if(s(o))for(let e=0;eo[e]?o[e]:"");return a.replace(/\?$/,"")},G=e=>{const t=B.filter(t=>t.regex.test(e));return t.length>0?O.extend({},t[0],{url:H(t[0],e)}):null},W=(e,t)=>{const r=O.extend({},t);if(!r.source&&(O.extend(r,D(r.embed??"",e.schema)),!r.source))return"";r.altsource||(r.altsource=""),r.poster||(r.poster=""),r.source=e.convertURL(r.source,"source"),r.altsource=e.convertURL(r.altsource,"source"),r.sourcemime=z(r.source),r.altsourcemime=z(r.altsource),r.poster=e.convertURL(r.poster,"poster");const o=G(r.source);if(o&&(r.source=o.url,r.type=o.type,r.allowfullscreen=o.allowFullscreen,r.width=r.width||String(o.w),r.height=r.height||String(o.h)),r.embed)return I(r.embed,r,!0,e.schema);{const t=w(e),o=y(e),a=f(e);return r.width=r.width||"300",r.height=r.height||"150",O.each(r,(t,o)=>{r[o]=e.dom.encode(""+t)}),"iframe"===r.type?((e,t)=>{if(t)return t(e);{const t=e.allowfullscreen?' allowFullscreen="1"':"";return'"}})(r,a):"application/x-shockwave-flash"===r.sourcemime?(e=>{let t='';return e.poster&&(t+=''),t+="",t})(r):-1!==r.sourcemime.indexOf("audio")?((e,t)=>t?t(e):'")(r,t):((e,t)=>t?t(e):'")(r,o)}},q=e=>e.hasAttribute("data-mce-object")||e.hasAttribute("data-ephox-embed-iri"),J={},K=e=>t=>W(e,t),Q=(e,t)=>{const r=_(e);return r?((e,t,r)=>new Promise((o,a)=>{const s=r=>(r.html&&(J[e.source]=r),o({url:e.source,html:r.html?r.html:t(e)}));J[e.source]?s(J[e.source]):r({url:e.source}).then(s).catch(a)}))(t,K(e),r):((e,t)=>Promise.resolve({html:t(e),url:e.source}))(t,K(e))},V=(e,t)=>{const r={};return h(e,"dimensions").each(e=>{l(["width","height"],o=>{h(t,o).orThunk(()=>h(e,o)).each(e=>r[o]=e)})}),r},X=(e,t)=>{const r=t&&"dimensions"!==t?((e,t)=>h(t,e).bind(e=>h(e,"meta")))(t,e).getOr({}):{},a=((e,t,r)=>a=>{const s=()=>h(e,a),i=()=>h(t,a),c=e=>h(e,"value").bind(e=>e.length>0?n.some(e):n.none());return{[a]:(a===r?s().bind(e=>o(e)?c(e).orThunk(i):i().orThunk(()=>n.from(e))):i().orThunk(()=>s().bind(e=>o(e)?c(e):n.from(e)))).getOr("")}})(e,r,t);return{...a("source"),...a("altsource"),...a("poster"),...a("embed"),...V(e,r)}},Y=e=>{const t={...e,source:{value:h(e,"source").getOr("")},altsource:{value:h(e,"altsource").getOr("")},poster:{value:h(e,"poster").getOr("")}};return l(["width","height"],r=>{h(e,r).each(e=>{const o=t.dimensions||{};o[r]=e,t.dimensions=o})}),t},Z=e=>t=>{const r=t&&t.msg?"Media embed handler error: "+t.msg:"Media embed handler threw unknown error.";e.notificationManager.open({type:"error",text:r})},ee=(e,t)=>o=>{if(r(o.url)&&o.url.trim().length>0){const r=o.html,a={...D(r,t.schema),source:o.url,embed:r};e.setData(Y(a))}},te=(e,t)=>{const r=e.dom.select("*[data-mce-object]");e.insertContent(t),((e,t)=>{const r=e.dom.select("*[data-mce-object]");for(let e=0;e=0;o--)t[e]===r[o]&&r.splice(o,1);e.selection.select(r[0])})(e,r),e.nodeChanged()},re=(e,t)=>s(t)&&"ephox-embed-iri"===t&&s(G(e)),oe=(e,t)=>((e,t)=>e.width!==t.width||e.height!==t.height)(e,t)&&re(t.source,e.type),ae=e=>{const t=(e=>{const t=e.selection.getNode(),r=q(t)?e.serializer.serialize(t,{selection:!0}):"",o=D(r,e.schema),a=(()=>{if(re(o.source,o.type)){const r=e.dom.getRect(t);return{width:r.w.toString().replace(/px$/,""),height:r.h.toString().replace(/px$/,"")}}return{}})();return{embed:r,...o,...a}})(e),r=(e=>{let t=e;return{get:()=>t,set:e=>{t=e}}})(t),o=Y(t),a=j(e)?[{type:"sizeinput",name:"dimensions",label:"Constrain proportions",constrain:!0}]:[],s={title:"General",name:"general",items:m([[{name:"source",type:"urlinput",filetype:"media",label:"Source",picker_text:"Browse files"}],a])},i=[];k(e)&&i.push({name:"altsource",type:"urlinput",filetype:"media",label:"Alternative source URL"}),A(e)&&i.push({name:"poster",type:"urlinput",filetype:"image",label:"Media poster (Image URL)"});const n={title:"Advanced",name:"advanced",items:i},c=[s,{title:"Embed",items:[{type:"textarea",name:"embed",label:"Paste your embed code below:"}]}];i.length>0&&c.push(n);const l={type:"tabpanel",tabs:c},u=e.windowManager.open({title:"Insert/Edit Media",size:"normal",body:l,buttons:[{type:"cancel",name:"cancel",text:"Cancel"},{type:"submit",name:"save",text:"Save",primary:!0}],onSubmit:t=>{const o=X(t.getData());((e,t,r)=>{var o;t.embed=oe(e,t)&&j(r)?W(r,{...t,embed:""}):I(t.embed??"",t,!1,r.schema),t.embed&&(e.source===t.source||(o=t.source,p(J,o)))?te(r,t.embed):Q(r,t).then(e=>{te(r,e.html)}).catch(Z(r))})(r.get(),o,e),t.close()},onChange:(t,o)=>{switch(o.name){case"source":((t,r)=>{const o=X(r.getData(),"source");t.source!==o.source&&(ee(u,e)({url:o.source,html:""}),Q(e,o).then(ee(u,e)).catch(Z(e)))})(r.get(),t);break;case"embed":(t=>{const r=X(t.getData()),o=D(r.embed??"",e.schema);t.setData(Y(o))})(t);break;case"dimensions":case"altsource":case"poster":((t,r,o)=>{const a=X(t.getData(),r),s=oe(o,a)&&j(e)?{...a,embed:""}:a,i=W(e,s);t.setData(Y({...s,embed:i}))})(t,o.name,r.get())}r.set(X(t.getData()))},initialData:o})},se=e=>({showDialog:()=>{ae(e)}});var ie=tinymce.util.Tools.resolve("tinymce.Env");const ne=e=>{const t=e.name;return"iframe"===t||"video"===t||"audio"===t},ce=(e,t,r,o=null)=>{const a=e.attr(r);return s(a)?a:p(t,r)?null:o},le=(e,t,r)=>{const o="img"===t.name||"video"===e.name,a=o?"300":null,s="audio"===e.name?"30":"150",i=o?s:null;t.attr({width:ce(e,r,"width",a),height:ce(e,r,"height",i)})},me=(e,t)=>{const r=t.name,o=new F("img",1);return de(e,t,o),le(t,o,{}),o.attr({style:t.attr("style"),src:ie.transparentSrc,"data-mce-object":r,class:"mce-object mce-object-"+r}),o},ue=(e,t)=>{const r=t.name,o=new F("span",1);o.attr({contentEditable:"false",style:t.attr("style"),"data-mce-object":r,class:"mce-preview-object mce-object-"+r}),de(e,t,o);const a=e.dom.parseStyle(t.attr("style")??""),i=new F(r,1);if(le(t,i,a),i.attr({src:t.attr("src"),style:t.attr("style"),class:t.attr("class")}),"iframe"===r)i.attr({allowfullscreen:t.attr("allowfullscreen"),frameborder:"0",sandbox:t.attr("sandbox"),referrerpolicy:t.attr("referrerpolicy")});else{l(["controls","crossorigin","currentTime","loop","muted","poster","preload"],e=>{i.attr(e,t.attr(e))});const a=o.attr("data-mce-html");s(a)&&((e,t,r,o)=>{const a=P(e.schema).parse(o,{context:t});for(;a.firstChild;)r.append(a.firstChild)})(e,r,i,unescape(a))}const n=new F("span",1);return n.attr("class","mce-shim"),o.append(i),o.append(n),o},de=(e,t,r)=>{const o=t.attributes??[];let a=o.length;for(;a--;){const t=o[a].name;let s=o[a].value;"width"===t||"height"===t||"style"===t||g(t,"data-mce-")||("data"!==t&&"src"!==t||(s=e.convertURL(s,t)),r.attr("data-mce-p-"+t,s))}const s=N({inner:!0},e.schema),i=new F("div",1);l(t.children(),e=>i.append(e));const n=s.serialize(i);n&&(r.attr("data-mce-html",escape(n)),r.empty())},he=e=>{const t=e.attr("class");return r(t)&&/\btiny-pageembed\b/.test(t)},pe=e=>{let t=e;for(;t=t.parent;)if(t.attr("data-ephox-embed-iri")||he(t))return!0;return!1};let ge;const be=(e,t)=>{const o=(s(ge)||(ge=(new DOMParser).parseFromString("","text/html")),ge),a=t.attr("data-mce-object"),i=o.createElement(a);if("audio"!==a){const e=t.attr("class"),o=t.firstChild;if(e&&-1!==e.indexOf("mce-preview-object")&&o){const e=o.attr("width"),t=o.attr("height");r(e)&&i.setAttribute("width",e),r(t)&&i.setAttribute("height",t)}else{const e=t.attr("width"),o=t.attr("height");r(e)&&i.setAttribute("width",e),r(o)&&i.setAttribute("height",o)}}const c=t.attr("style");r(c)&&i.setAttribute("style",c);const l=t.attributes??[];let m=l.length;for(;m--;){const e=l[m].name;0===e.indexOf("data-mce-p-")&&i.setAttribute(e.substr(11),l[m].value)}const u=t.attr("data-mce-html");r(u)?i.innerHTML=unescape(u):i.innerHTML="\xa0";const d=((e,t)=>{const r=(0,e.options.get)("xss_sanitization"),o=x(e);return P(e.schema,{sanitize:r,validate:o}).parse(t)})(e,i.outerHTML),h=d.getAll(a)[0];return s(h)?(r(u)||h.empty(),n.some(h)):n.none()},we=e=>t=>{const r=()=>{t.setEnabled(e.selection.isEditable())};return e.on("NodeChange",r),r(),()=>{e.off("NodeChange",r)}},ye="media";e.add(ye,e=>((e=>{const t=e.options.register;t("audio_template_callback",{processor:"function"}),t("video_template_callback",{processor:"function"}),t("iframe_template_callback",{processor:"function"}),t("media_live_embeds",{processor:"boolean",default:!0}),t("media_filter_html",{processor:"boolean",default:!0}),t("media_url_resolver",{processor:"function"}),t("media_alt_source",{processor:"boolean",default:!0}),t("media_poster",{processor:"boolean",default:!0}),t("media_dimensions",{processor:"boolean",default:!0})})(e),(e=>{e.addCommand("mceMedia",()=>{ae(e)})})(e),(e=>{const t=()=>e.execCommand("mceMedia");e.ui.registry.addToggleButton("media",{tooltip:"Insert/edit media",icon:"embed",onAction:t,onSetup:t=>{const r=e.selection;t.setActive(q(r.getNode()));const o=r.selectorChangedWithUnbind("img[data-mce-object],span[data-mce-object],div[data-ephox-embed-iri]",t.setActive).unbind,a=we(e)(t);return()=>{o(),a()}}}),e.ui.registry.addMenuItem("media",{icon:"embed",text:"Media...",onAction:t,onSetup:we(e)})})(e),(e=>{e.on("ResolveName",e=>{let t;1===e.target.nodeType&&(t=e.target.getAttribute("data-mce-object"))&&(e.name=t)})})(e),(e=>{e.on("PreInit",()=>{const{schema:t,serializer:r,parser:o}=e,a=t.getBoolAttrs();l("webkitallowfullscreen mozallowfullscreen".split(" "),e=>{a[e]={}}),((e,t)=>{const r=u(e);for(let o=0,a=r.length;o{const o=t.getElementRule(r);o&&l(e,e=>{o.attributes[e]={},o.attributesOrder.push(e)})}),o.addNodeFilter("iframe,video,audio,object,embed",(e=>t=>{let r,o=t.length;for(;o--;)r=t[o],r.parent&&(r.parent.attr("data-mce-object")||(ne(r)&&v(e)?pe(r)||r.replace(ue(e,r)):pe(r)||r.replace(me(e,r))))})(e)),r.addAttributeFilter("data-mce-object",t=>{let r=t.length;for(;r--;){const o=t[r];o.parent&&be(e,o).fold(()=>o.remove(),e=>o.replace(e))}})}),e.on("SetContent",()=>{const t=e.dom;l(t.select("span.mce-preview-object"),e=>{0===t.select("span.mce-shim",e).length&&t.add(e,"span",{class:"mce-shim"})})})})(e),(e=>{e.on("mousedown",t=>{const r=e.dom.getParent(t.target,".mce-preview-object");r&&"2"===e.dom.getAttrib(r,"data-mce-selected")&&t.stopImmediatePropagation()}),e.on("click keyup touchend",()=>{const t=e.selection.getNode();t&&e.dom.hasClass(t,"mce-preview-object")&&e.dom.getAttrib(t,"data-mce-selected")&&t.setAttribute("data-mce-selected","2")}),e.on("ObjectResized",t=>{const r=t.target;if(r.getAttribute("data-mce-object")){let o=r.getAttribute("data-mce-html");o&&(o=unescape(o),r.setAttribute("data-mce-html",escape(I(o,{width:String(t.width),height:String(t.height)},!1,e.schema))))}})})(e),{...se(e),getMetadata:()=>({name:"Media",type:"opensource",slug:ye})}))}(); \ No newline at end of file diff --git a/public/assets/tinymce/plugins/nonbreaking/plugin.js b/public/assets/tinymce/plugins/nonbreaking/plugin.js index 2445c8a20..baa79675a 100644 --- a/public/assets/tinymce/plugins/nonbreaking/plugin.js +++ b/public/assets/tinymce/plugins/nonbreaking/plugin.js @@ -1,5 +1,5 @@ /** - * TinyMCE version 8.1.2 (TBD) + * TinyMCE version 8.10.0 (2026-10-14) */ (function () { @@ -109,12 +109,16 @@ * @class tinymce.nonbreaking.Plugin * @private */ + const PLUGIN_CODE = 'nonbreaking'; var Plugin = () => { - global$1.add('nonbreaking', (editor) => { + global$1.add(PLUGIN_CODE, (editor) => { register$2(editor); register$1(editor); register(editor); setup(editor); + return { + getMetadata: () => ({ name: 'Nonbreaking', type: 'opensource', slug: PLUGIN_CODE }) + }; }); }; diff --git a/public/assets/tinymce/plugins/nonbreaking/plugin.min.js b/public/assets/tinymce/plugins/nonbreaking/plugin.min.js index c33bce1b9..177bea763 100644 --- a/public/assets/tinymce/plugins/nonbreaking/plugin.min.js +++ b/public/assets/tinymce/plugins/nonbreaking/plugin.min.js @@ -1 +1 @@ -!function(){"use strict";var n=tinymce.util.Tools.resolve("tinymce.PluginManager");const e=n=>e=>typeof e===n,o=e("boolean"),a=e("number"),t=n=>e=>e.options.get(n),i=t("nonbreaking_force_tab"),s=t("nonbreaking_wrap"),r=(n,e)=>{let o="";for(let a=0;a{const o=s(n)||n.plugins.visualchars?`${r(" ",e)}`:r(" ",e);n.undoManager.transact((()=>n.insertContent(o)))};var l=tinymce.util.Tools.resolve("tinymce.util.VK");const u=n=>e=>{const o=()=>{e.setEnabled(n.selection.isEditable())};return n.on("NodeChange",o),o(),()=>{n.off("NodeChange",o)}};n.add("nonbreaking",(n=>{(n=>{const e=n.options.register;e("nonbreaking_force_tab",{processor:n=>o(n)?{value:n?3:0,valid:!0}:a(n)?{value:n,valid:!0}:{valid:!1,message:"Must be a boolean or number."},default:!1}),e("nonbreaking_wrap",{processor:"boolean",default:!0})})(n),(n=>{n.addCommand("mceNonBreaking",(()=>{c(n,1)}))})(n),(n=>{const e=()=>n.execCommand("mceNonBreaking");n.ui.registry.addButton("nonbreaking",{icon:"non-breaking",tooltip:"Nonbreaking space",onAction:e,onSetup:u(n)}),n.ui.registry.addMenuItem("nonbreaking",{icon:"non-breaking",text:"Nonbreaking space",onAction:e,onSetup:u(n)})})(n),(n=>{const e=i(n);e>0&&n.on("keydown",(o=>{if(o.keyCode===l.TAB&&!o.isDefaultPrevented()){if(o.shiftKey)return;o.preventDefault(),o.stopImmediatePropagation(),c(n,e)}}))})(n)}))}(); \ No newline at end of file +!function(){"use strict";var n=tinymce.util.Tools.resolve("tinymce.PluginManager");const e=n=>e=>typeof e===n,o=e("boolean"),a=e("number"),t=n=>e=>e.options.get(n),i=t("nonbreaking_force_tab"),s=t("nonbreaking_wrap"),r=(n,e)=>{let o="";for(let a=0;a{const o=s(n)||n.plugins.visualchars?`${r(" ",e)}`:r(" ",e);n.undoManager.transact(()=>n.insertContent(o))};var l=tinymce.util.Tools.resolve("tinymce.util.VK");const u=n=>e=>{const o=()=>{e.setEnabled(n.selection.isEditable())};return n.on("NodeChange",o),o(),()=>{n.off("NodeChange",o)}},g="nonbreaking";n.add(g,n=>((n=>{const e=n.options.register;e("nonbreaking_force_tab",{processor:n=>o(n)?{value:n?3:0,valid:!0}:a(n)?{value:n,valid:!0}:{valid:!1,message:"Must be a boolean or number."},default:!1}),e("nonbreaking_wrap",{processor:"boolean",default:!0})})(n),(n=>{n.addCommand("mceNonBreaking",()=>{c(n,1)})})(n),(n=>{const e=()=>n.execCommand("mceNonBreaking");n.ui.registry.addButton("nonbreaking",{icon:"non-breaking",tooltip:"Nonbreaking space",onAction:e,onSetup:u(n)}),n.ui.registry.addMenuItem("nonbreaking",{icon:"non-breaking",text:"Nonbreaking space",onAction:e,onSetup:u(n)})})(n),(n=>{const e=i(n);e>0&&n.on("keydown",o=>{if(o.keyCode===l.TAB&&!o.isDefaultPrevented()){if(o.shiftKey)return;o.preventDefault(),o.stopImmediatePropagation(),c(n,e)}})})(n),{getMetadata:()=>({name:"Nonbreaking",type:"opensource",slug:g})}))}(); \ No newline at end of file diff --git a/public/assets/tinymce/plugins/pagebreak/plugin.js b/public/assets/tinymce/plugins/pagebreak/plugin.js index 3838e8c99..414bdb3a2 100644 --- a/public/assets/tinymce/plugins/pagebreak/plugin.js +++ b/public/assets/tinymce/plugins/pagebreak/plugin.js @@ -1,5 +1,5 @@ /** - * TinyMCE version 8.1.2 (TBD) + * TinyMCE version 8.10.0 (2026-10-14) */ (function () { @@ -103,13 +103,17 @@ }); }; + const PLUGIN_CODE = 'pagebreak'; var Plugin = () => { - global$1.add('pagebreak', (editor) => { + global$1.add(PLUGIN_CODE, (editor) => { register$2(editor); register$1(editor); register(editor); setup$1(editor); setup(editor); + return { + getMetadata: () => ({ name: 'Page Break', type: 'opensource', slug: PLUGIN_CODE }) + }; }); }; diff --git a/public/assets/tinymce/plugins/pagebreak/plugin.min.js b/public/assets/tinymce/plugins/pagebreak/plugin.min.js index 8cf44f243..083ad8a00 100644 --- a/public/assets/tinymce/plugins/pagebreak/plugin.min.js +++ b/public/assets/tinymce/plugins/pagebreak/plugin.min.js @@ -1 +1 @@ -!function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager"),a=tinymce.util.Tools.resolve("tinymce.Env");const t=e=>a=>a.options.get(e),n=t("pagebreak_separator"),o=t("pagebreak_split_block"),r="mce-pagebreak",s=e=>{const t=``;return e?`

      ${t}

      `:t},c=e=>a=>{const t=()=>{a.setEnabled(e.selection.isEditable())};return e.on("NodeChange",t),t(),()=>{e.off("NodeChange",t)}};e.add("pagebreak",(e=>{(e=>{const a=e.options.register;a("pagebreak_separator",{processor:"string",default:"\x3c!-- pagebreak --\x3e"}),a("pagebreak_split_block",{processor:"boolean",default:!1})})(e),(e=>{e.addCommand("mcePageBreak",(()=>{e.insertContent(s(o(e)))}))})(e),(e=>{const a=()=>e.execCommand("mcePageBreak");e.ui.registry.addButton("pagebreak",{icon:"page-break",tooltip:"Page break",onAction:a,onSetup:c(e)}),e.ui.registry.addMenuItem("pagebreak",{text:"Page break",icon:"page-break",onAction:a,onSetup:c(e)})})(e),(e=>{const a=n(e),t=()=>o(e),c=new RegExp(a.replace(/[\?\.\*\[\]\(\)\{\}\+\^\$\:]/g,(e=>"\\"+e)),"gi");e.on("BeforeSetContent",(e=>{e.content=e.content.replace(c,s(t()))})),e.on("PreInit",(()=>{e.serializer.addNodeFilter("img",(n=>{let o,s,c=n.length;for(;c--;)if(o=n[c],s=o.attr("class"),s&&-1!==s.indexOf(r)){const n=o.parent;if(n&&e.schema.getBlockElements()[n.name]&&t()){n.type=3,n.value=a,n.raw=!0,o.remove();continue}o.type=3,o.value=a,o.raw=!0}}))}))})(e),(e=>{e.on("ResolveName",(a=>{"IMG"===a.target.nodeName&&e.dom.hasClass(a.target,r)&&(a.name="pagebreak")}))})(e)}))}(); \ No newline at end of file +!function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager"),a=tinymce.util.Tools.resolve("tinymce.Env");const t=e=>a=>a.options.get(e),n=t("pagebreak_separator"),o=t("pagebreak_split_block"),r="mce-pagebreak",s=e=>{const t=``;return e?`

      ${t}

      `:t},c=e=>a=>{const t=()=>{a.setEnabled(e.selection.isEditable())};return e.on("NodeChange",t),t(),()=>{e.off("NodeChange",t)}},i="pagebreak";e.add(i,e=>((e=>{const a=e.options.register;a("pagebreak_separator",{processor:"string",default:"\x3c!-- pagebreak --\x3e"}),a("pagebreak_split_block",{processor:"boolean",default:!1})})(e),(e=>{e.addCommand("mcePageBreak",()=>{e.insertContent(s(o(e)))})})(e),(e=>{const a=()=>e.execCommand("mcePageBreak");e.ui.registry.addButton("pagebreak",{icon:"page-break",tooltip:"Page break",onAction:a,onSetup:c(e)}),e.ui.registry.addMenuItem("pagebreak",{text:"Page break",icon:"page-break",onAction:a,onSetup:c(e)})})(e),(e=>{const a=n(e),t=()=>o(e),c=new RegExp(a.replace(/[\?\.\*\[\]\(\)\{\}\+\^\$\:]/g,e=>"\\"+e),"gi");e.on("BeforeSetContent",e=>{e.content=e.content.replace(c,s(t()))}),e.on("PreInit",()=>{e.serializer.addNodeFilter("img",n=>{let o,s,c=n.length;for(;c--;)if(o=n[c],s=o.attr("class"),s&&-1!==s.indexOf(r)){const n=o.parent;if(n&&e.schema.getBlockElements()[n.name]&&t()){n.type=3,n.value=a,n.raw=!0,o.remove();continue}o.type=3,o.value=a,o.raw=!0}})})})(e),(e=>{e.on("ResolveName",a=>{"IMG"===a.target.nodeName&&e.dom.hasClass(a.target,r)&&(a.name="pagebreak")})})(e),{getMetadata:()=>({name:"Page Break",type:"opensource",slug:i})}))}(); \ No newline at end of file diff --git a/public/assets/tinymce/plugins/preview/plugin.js b/public/assets/tinymce/plugins/preview/plugin.js index 510ff653a..1610acc97 100644 --- a/public/assets/tinymce/plugins/preview/plugin.js +++ b/public/assets/tinymce/plugins/preview/plugin.js @@ -1,23 +1,52 @@ /** - * TinyMCE version 8.1.2 (TBD) + * TinyMCE version 8.10.0 (2026-10-14) */ (function () { 'use strict'; - var global$1 = tinymce.util.Tools.resolve('tinymce.PluginManager'); - /* eslint-disable @typescript-eslint/no-wrapper-object-types */ + const hasProto = (v, constructor, predicate) => { + if (predicate(v, constructor.prototype)) { + return true; + } + else { + // String-based fallback time + return v.constructor?.name === constructor.name; + } + }; + const typeOf = (x) => { + const t = typeof x; + if (x === null) { + return 'null'; + } + else if (t === 'object' && Array.isArray(x)) { + return 'array'; + } + else if (t === 'object' && hasProto(x, String, (o, proto) => proto.isPrototypeOf(o))) { + return 'string'; + } + else { + return t; + } + }; + const isType = (type) => (value) => typeOf(value) === type; + const isSimpleType = (type) => (value) => typeof value === type; const eq = (t) => (a) => t === a; + const isString = isType('string'); const isUndefined = eq(undefined); const isNullable = (a) => a === null || a === undefined; const isNonNullable = (a) => !isNullable(a); + const isFunction = isSimpleType('function'); const constant = (value) => { return () => { return value; }; }; + const identity = (x) => { + return x; + }; const never = constant(false); /** @@ -36,6 +65,11 @@ * strict-null-checks */ class Optional { + tag; + value; + // Sneaky optimisation: every instance of Optional.none is identical, so just + // reuse the same object + static singletonNone = new Optional(false); // The internal representation has a `tag` and a `value`, but both are // private: able to be console.logged, but not able to be accessed by code constructor(tag, value) { @@ -203,7 +237,7 @@ */ getOrDie(message) { if (!this.tag) { - throw new Error(message !== null && message !== void 0 ? message : 'Called getOrDie on None'); + throw new Error(message ?? 'Called getOrDie on None'); } else { return this.value; @@ -267,10 +301,31 @@ return this.tag ? `some(${this.value})` : 'none()'; } } - // Sneaky optimisation: every instance of Optional.none is identical, so just - // reuse the same object - Optional.singletonNone = new Optional(false); + const nativeSlice = Array.prototype.slice; + const nativeIndexOf = Array.prototype.indexOf; + const rawIndexOf = (ts, t) => nativeIndexOf.call(ts, t); + const contains$1 = (xs, x) => rawIndexOf(xs, x) > -1; + const exists = (xs, pred) => { + for (let i = 0, len = xs.length; i < len; i++) { + const x = xs[i]; + if (pred(x, i)) { + return true; + } + } + return false; + }; + const map = (xs, f) => { + // pre-allocating array size when it's guaranteed to be known + // http://jsperf.com/push-allocated-vs-dynamic/22 + const len = xs.length; + const r = new Array(len); + for (let i = 0; i < len; i++) { + const x = xs[i]; + r[i] = f(x, i); + } + return r; + }; const findUntil = (xs, pred, until) => { for (let i = 0, len = xs.length; i < len; i++) { const x = xs[i]; @@ -286,6 +341,7 @@ const find$1 = (xs, pred) => { return findUntil(xs, pred, never); }; + isFunction(Array.from) ? Array.from : (x) => nativeSlice.call(x); const findMap = (arr, f) => { for (let i = 0; i < arr.length; i++) { const r = f(arr[i], i); @@ -295,6 +351,43 @@ } return Optional.none(); }; + const unique = (xs, comparator) => { + const r = []; + const isDuplicated = isFunction(comparator) ? + (x) => exists(r, (i) => comparator(i, x)) : + (x) => contains$1(r, x); + for (let i = 0, len = xs.length; i < len; i++) { + const x = xs[i]; + if (!isDuplicated(x)) { + r.push(x); + } + } + return r; + }; + + // There are many variations of Object iteration that are faster than the 'for-in' style: + // http://jsperf.com/object-keys-iteration/107 + // + // Use the native keys if it is available (IE9+), otherwise fall back to manually filtering + const keys = Object.keys; + const each = (obj, f) => { + const props = keys(obj); + for (let k = 0, len = props.length; k < len; k++) { + const i = props[k]; + const x = obj[i]; + f(x, i); + } + }; + const mapToArray = (obj, f) => { + const r = []; + each(obj, (value, name) => { + r.push(f(value, name)); + }); + return r; + }; + const values = (obj) => { + return mapToArray(obj, identity); + }; const contains = (str, substr, start = 0, end) => { const idx = str.indexOf(substr, start); @@ -318,6 +411,8 @@ }; }; + var global$2 = tinymce.util.Tools.resolve('tinymce.PluginManager'); + const DeviceType = (os, browser, userAgent, mediaMatch) => { const isiPad = os.isiOS() && /ipad/i.test(userAgent) === true; const isiPhone = os.isiOS() && !isiPad; @@ -381,7 +476,7 @@ const detectBrowser$1 = (browsers, userAgentData) => { return findMap(userAgentData.brands, (uaBrand) => { const lcBrand = uaBrand.brand.toLowerCase(); - return find$1(browsers, (browser) => { var _a; return lcBrand === ((_a = browser.brand) === null || _a === void 0 ? void 0 : _a.toLowerCase()); }) + return find$1(browsers, (browser) => lcBrand === browser.brand?.toLowerCase()) .map((info) => ({ current: info.name, version: Version.nu(parseInt(uaBrand.version, 10), 0) @@ -655,27 +750,51 @@ return ``; }; + var global$1 = tinymce.util.Tools.resolve('tinymce.dom.ScriptLoader'); + var global = tinymce.util.Tools.resolve('tinymce.util.Tools'); const option = (name) => (editor) => editor.options.get(name); const getContentStyle = option('content_style'); const shouldUseContentCssCors = option('content_css_cors'); + const getCrossOrigin = option('crossorigin'); const getBodyClass = option('body_class'); const getBodyId = option('body_id'); - const getPreviewHtml = (editor) => { - var _a; + const getComponentScriptsHtml = (editor) => { + const urls = unique(values(editor.schema.getComponentUrls())); + return map(urls, (url) => { + const attrs = mapToArray(global$1.ScriptLoader.getScriptAttributes(url), (v, k) => ` ${editor.dom.encode(k)}="${editor.dom.encode(v)}"`); + return ``; + }).join(''); + }; + const getStyleSheetCrossOrigin = (editor) => { + if (shouldUseContentCssCors(editor)) { + return constant('anonymous'); + } + const crossOrigin = getCrossOrigin(editor); + return (url) => crossOrigin(url, 'stylesheet'); + }; + const getPreviewHtml = (editor, contentCssResources) => { let headHtml = ''; const encode = editor.dom.encode; - const contentStyle = (_a = getContentStyle(editor)) !== null && _a !== void 0 ? _a : ''; + const contentStyle = getContentStyle(editor) ?? ''; headHtml += ``; - const cors = shouldUseContentCssCors(editor) ? ' crossorigin="anonymous"' : ''; - global.each(editor.contentCSS, (url) => { - headHtml += ''; + const styleSheetCrossOrigin = getStyleSheetCrossOrigin(editor); + global.each(contentCssResources, (resource) => { + if (resource.type === 'bundled') { + headHtml += ''; + } + else { + const corsValue = styleSheetCrossOrigin(resource.url); + const cors = corsValue ? ' crossorigin="' + encode(corsValue) + '"' : ''; + headHtml += ''; + } }); if (contentStyle) { headHtml += ''; } + headHtml += getComponentScriptsHtml(editor); const bodyId = getBodyId(editor); const bodyClass = getBodyClass(editor); const directionality = editor.getBody().dir; @@ -693,8 +812,8 @@ return previewHtml; }; - const open = (editor) => { - const content = getPreviewHtml(editor); + const open = (editor, contentCssResources) => { + const content = getPreviewHtml(editor, contentCssResources); const dataApi = editor.windowManager.open({ title: 'Preview', size: 'large', @@ -726,9 +845,9 @@ dataApi.focus('close'); }; - const register$1 = (editor) => { + const register$1 = (editor, getContentCssResources) => { editor.addCommand('mcePreview', () => { - open(editor); + open(editor, getContentCssResources()); }); }; @@ -748,10 +867,18 @@ }); }; + const PLUGIN_CODE = 'preview'; var Plugin = () => { - global$1.add('preview', (editor) => { - register$1(editor); + global$2.add(PLUGIN_CODE, (editor) => { + const getContentCssResources = () => map(editor.contentCSS, (key) => Optional.from(tinymce.Resource.get(key)) + .filter(isString) + .map((content) => ({ type: 'bundled', content })) + .getOr({ type: 'link', url: editor.documentBaseURI.toAbsolute(key) })); + register$1(editor, getContentCssResources); register(editor); + return { + getMetadata: () => ({ name: 'Preview', type: 'opensource', slug: PLUGIN_CODE }) + }; }); }; diff --git a/public/assets/tinymce/plugins/preview/plugin.min.js b/public/assets/tinymce/plugins/preview/plugin.min.js index 45fa49da9..6390de2a8 100644 --- a/public/assets/tinymce/plugins/preview/plugin.min.js +++ b/public/assets/tinymce/plugins/preview/plugin.min.js @@ -1 +1 @@ -!function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager");const t=e=>undefined===e;const r=e=>()=>e,n=r(!1);class s{constructor(e,t){this.tag=e,this.value=t}static some(e){return new s(!0,e)}static none(){return s.singletonNone}fold(e,t){return this.tag?t(this.value):e()}isSome(){return this.tag}isNone(){return!this.tag}map(e){return this.tag?s.some(e(this.value)):s.none()}bind(e){return this.tag?e(this.value):s.none()}exists(e){return this.tag&&e(this.value)}forall(e){return!this.tag||e(this.value)}filter(e){return!this.tag||e(this.value)?this:s.none()}getOr(e){return this.tag?this.value:e}or(e){return this.tag?this:e}getOrThunk(e){return this.tag?this.value:e()}orThunk(e){return this.tag?this:e()}getOrDie(e){if(this.tag)return this.value;throw new Error(null!=e?e:"Called getOrDie on None")}static from(e){return null==e?s.none():s.some(e)}getOrNull(){return this.tag?this.value:null}getOrUndefined(){return this.value}each(e){this.tag&&e(this.value)}toArray(){return this.tag?[this.value]:[]}toString(){return this.tag?`some(${this.value})`:"none()"}}s.singletonNone=new s(!1);const i=(e,t)=>((e,t,r)=>{for(let n=0,i=e.length;n{const i=e.indexOf(r,n);return-1!==i&&(!!t(s)||i+r.length<=s)},a=()=>c(0,0),c=(e,t)=>({major:e,minor:t}),u={nu:c,detect:(e,t)=>{const r=String(t).toLowerCase();return 0===e.length?a():((e,t)=>{const r=((e,t)=>{for(let r=0;rNumber(t.replace(r,"$"+e));return c(n(1),n(2))})(e,r)},unknown:a},l=(e,t)=>{const r=String(t).toLowerCase();return i(e,(e=>e.search(r)))},d=/.*?version\/\ ?([0-9]+)\.([0-9]+).*/,h=e=>t=>o(t,e),m=[{name:"Edge",versionRegexes:[/.*?edge\/ ?([0-9]+)\.([0-9]+)$/],search:e=>o(e,"edge/")&&o(e,"chrome")&&o(e,"safari")&&o(e,"applewebkit")},{name:"Chromium",brand:"Chromium",versionRegexes:[/.*?chrome\/([0-9]+)\.([0-9]+).*/,d],search:e=>o(e,"chrome")&&!o(e,"chromeframe")},{name:"IE",versionRegexes:[/.*?msie\ ?([0-9]+)\.([0-9]+).*/,/.*?rv:([0-9]+)\.([0-9]+).*/],search:e=>o(e,"msie")||o(e,"trident")},{name:"Opera",versionRegexes:[d,/.*?opera\/([0-9]+)\.([0-9]+).*/],search:h("opera")},{name:"Firefox",versionRegexes:[/.*?firefox\/\ ?([0-9]+)\.([0-9]+).*/],search:h("firefox")},{name:"Safari",versionRegexes:[d,/.*?cpu os ([0-9]+)_([0-9]+).*/],search:e=>(o(e,"safari")||o(e,"mobile/"))&&o(e,"applewebkit")}],v=[{name:"Windows",search:h("win"),versionRegexes:[/.*?windows\ nt\ ?([0-9]+)\.([0-9]+).*/]},{name:"iOS",search:e=>o(e,"iphone")||o(e,"ipad"),versionRegexes:[/.*?version\/\ ?([0-9]+)\.([0-9]+).*/,/.*cpu os ([0-9]+)_([0-9]+).*/,/.*cpu iphone os ([0-9]+)_([0-9]+).*/]},{name:"Android",search:h("android"),versionRegexes:[/.*?android\ ?([0-9]+)\.([0-9]+).*/]},{name:"macOS",search:h("mac os x"),versionRegexes:[/.*?mac\ os\ x\ ?([0-9]+)_([0-9]+).*/]},{name:"Linux",search:h("linux"),versionRegexes:[]},{name:"Solaris",search:h("sunos"),versionRegexes:[]},{name:"FreeBSD",search:h("freebsd"),versionRegexes:[]},{name:"ChromeOS",search:h("cros"),versionRegexes:[/.*?chrome\/([0-9]+)\.([0-9]+).*/]}],g={browsers:r(m),oses:r(v)},p="Edge",f="Chromium",w="Opera",x="Firefox",S="Safari",y=e=>{const t=e.current,r=e.version,n=e=>()=>t===e;return{current:t,version:r,isEdge:n(p),isChromium:n(f),isIE:n("IE"),isOpera:n(w),isFirefox:n(x),isSafari:n(S)}},b=()=>y({current:void 0,version:u.unknown()}),O=y,R=(r(p),r(f),r("IE"),r(w),r(x),r(S),"Windows"),C="Android",A="Linux",k="macOS",D="Solaris",E="FreeBSD",I="ChromeOS",P=e=>{const t=e.current,r=e.version,n=e=>()=>t===e;return{current:t,version:r,isWindows:n(R),isiOS:n("iOS"),isAndroid:n(C),isMacOS:n(k),isLinux:n(A),isSolaris:n(D),isFreeBSD:n(E),isChromeOS:n(I)}},T=()=>P({current:void 0,version:u.unknown()}),_=P,B=(r(R),r("iOS"),r(C),r(A),r(k),r(D),r(E),r(I),(e,t,n)=>{const o=g.browsers(),a=g.oses(),c=t.bind((e=>((e,t)=>((e,t)=>{for(let r=0;r{const r=t.brand.toLowerCase();return i(e,(e=>{var t;return r===(null===(t=e.brand)||void 0===t?void 0:t.toLowerCase())})).map((e=>({current:e.name,version:u.nu(parseInt(t.version,10),0)})))})))(o,e))).orThunk((()=>((e,t)=>l(e,t).map((e=>{const r=u.detect(e.versionRegexes,t);return{current:e.name,version:r}})))(o,e))).fold(b,O),d=((e,t)=>l(e,t).map((e=>{const r=u.detect(e.versionRegexes,t);return{current:e.name,version:r}})))(a,e).fold(T,_),h=((e,t,n,s)=>{const i=e.isiOS()&&!0===/ipad/i.test(n),o=e.isiOS()&&!i,a=e.isiOS()||e.isAndroid(),c=a||s("(pointer:coarse)"),u=i||!o&&a&&s("(min-device-width:768px)"),l=o||a&&!u,d=t.isSafari()&&e.isiOS()&&!1===/safari/i.test(n),h=!l&&!u&&!d;return{isiPad:r(i),isiPhone:r(o),isTablet:r(u),isPhone:r(l),isTouch:r(c),isAndroid:e.isAndroid,isiOS:e.isiOS,isWebView:r(d),isDesktop:r(h)}})(d,c,e,n);return{browser:c,os:d,deviceType:h}}),L=e=>window.matchMedia(e).matches;let N=(e=>{let t,r=!1;return(...n)=>(r||(r=!0,t=e.apply(null,n)),t)})((()=>B(window.navigator.userAgent,s.from(window.navigator.userAgentData),L)));const F=()=>N();var M=tinymce.util.Tools.resolve("tinymce.util.Tools");const $=e=>t=>t.options.get(e),W=$("content_style"),U=$("content_css_cors"),K=$("body_class"),j=$("body_id"),V=e=>{const t=(e=>{var t;let r="";const n=e.dom.encode,s=null!==(t=W(e))&&void 0!==t?t:"";r+=``;const i=U(e)?' crossorigin="anonymous"':"";M.each(e.contentCSS,(t=>{r+='"})),s&&(r+='");const o=j(e),a=K(e),c=e.getBody().dir,u=c?' dir="'+n(c)+'"':"";return""+r+'"+e.getContent()+(()=>{const e=F().os.isMacOS()||F().os.isiOS();return`