@a3s-lab/office 0.28.0 → 0.29.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +27 -1
- package/dist/0~1403.js +1 -1
- package/dist/0~4980.js +1 -1
- package/dist/0~5093.js +64 -5
- package/dist/0~7043.js +241 -241
- package/dist/0~7048.js +1 -1
- package/dist/0~7614.js +1 -1
- package/dist/0~document-editor.js +433 -10
- package/dist/0~presentation-editor.js +1 -1
- package/dist/0~spreadsheet-editor.js +1 -2
- package/dist/0~work-docx-export.js +141 -3
- package/dist/0~work-docx-import.js +5 -3
- package/dist/0~work-office-diagnostics.js +46 -3
- package/dist/0~work-pptx-export.js +1 -1
- package/dist/0~work-pptx-import.js +1 -1
- package/dist/0~work-presentation-charts.js +1 -1
- package/dist/1544.js +1 -1
- package/dist/4104.js +2 -2
- package/dist/4121.js +1510 -0
- package/dist/6282.js +59 -684
- package/dist/8715.js +1 -1
- package/dist/core.js +1 -1
- package/dist/index.js +1 -1
- package/dist/internal/features/work/editors/document-command-catalog.d.ts +9 -0
- package/dist/internal/features/work/editors/document-font-dialog-model.d.ts +5 -2
- package/dist/internal/features/work/editors/document-font-dialog-run-border-model.d.ts +24 -0
- package/dist/internal/features/work/editors/document-font-dialog-run-border-section.d.ts +10 -0
- package/dist/internal/features/work/work-document-character-formatting.d.ts +4 -0
- package/dist/internal/features/work/work-document-format-changes.d.ts +1 -0
- package/dist/internal/features/work/work-document-run-border.d.ts +11 -0
- package/dist/internal/features/work/work-document-word-line-metrics.d.ts +1 -0
- package/dist/internal/features/work/work-docx-run-border-diagnostics.d.ts +3 -0
- package/dist/internal/features/work/work-docx-run-border-export.d.ts +17 -0
- package/dist/internal/features/work/work-docx-run-border.d.ts +20 -0
- package/dist/internal/features/work/work-docx-run-formatting-import.d.ts +2 -0
- package/dist/office-kernel.wasm +0 -0
- package/dist/styles.css +31 -0
- package/docs/latest/en/browser-editor-architecture.md +22 -0
- package/package.json +4 -1
- package/dist/5184.js +0 -662
- package/dist/9424.js +0 -16
package/dist/6282.js
CHANGED
|
@@ -9,7 +9,6 @@ import extension_text_align from "@tiptap/extension-text-align";
|
|
|
9
9
|
import font_size from "@tiptap/extension-text-style/font-size";
|
|
10
10
|
import starter_kit from "@tiptap/starter-kit";
|
|
11
11
|
import { DOMParser as model_DOMParser, Fragment, Slice } from "@tiptap/pm/model";
|
|
12
|
-
import jszip from "jszip";
|
|
13
12
|
import { closeHistory, isHistoryTransaction } from "@tiptap/pm/history";
|
|
14
13
|
import extension_underline from "@tiptap/extension-underline";
|
|
15
14
|
import extension_strike from "@tiptap/extension-strike";
|
|
@@ -22,8 +21,7 @@ import { CellSelection, TableMap, isInTable, selectedRect } from "@tiptap/pm/tab
|
|
|
22
21
|
import font_family from "@tiptap/extension-text-style/font-family";
|
|
23
22
|
import { TextStyle } from "@tiptap/extension-text-style";
|
|
24
23
|
import extension_highlight from "@tiptap/extension-highlight";
|
|
25
|
-
import {
|
|
26
|
-
import { normalizeCssColor } from "./9424.js";
|
|
24
|
+
import { documentRunBorderDomAttributes, normalizeDocumentRunBorder, parseDocumentRunBorder, normalizeDocumentParagraphBorder, serializeDocumentParagraphBorders, parseDocxThemeReference, serializeDocumentRunBorder, normalizeCssColor, DOCUMENT_PARAGRAPH_BORDERS_ATTRIBUTE, serializeDocxThemeReference, parseDocumentParagraphBordersElement, parseDocumentParagraphBorders, documentBorderPresentation, DOCUMENT_RUN_BORDER_ATTRIBUTE, parseDocumentRunBorderElement, documentRunBorderIsVisible, documentParagraphBordersDomAttributes, createOfficeId as createWorkId } from "./4121.js";
|
|
27
25
|
import { workOfficeCollaborationJsonEqual, canonicalWorkOfficeCollaborationJson, isWorkOfficeCollaborationRecord, cloneWorkOfficeCollaborationJson } from "./4650.js";
|
|
28
26
|
import { assertWorkOfficeCollaborationEditable, markWorkOfficeCollaborationInitialized, assertWorkOfficeCollaborationOrigin, initializeWorkOfficeCollaborationMetadata, assertWorkOfficeCollaborationWritable, OfficeCollaborationError as WorkOfficeCollaborationError, readOfficeCollaborationMetadata as readWorkOfficeCollaborationMetadata, registerWorkOfficeCollaborationInitializer } from "./9787.js";
|
|
29
27
|
import * as __rspack_external_yjs from "yjs";
|
|
@@ -2210,681 +2208,6 @@ function work_document_notes_positiveInteger(value, fallback) {
|
|
|
2210
2208
|
const number = Number(value);
|
|
2211
2209
|
return Number.isSafeInteger(number) && number > 0 ? number : fallback;
|
|
2212
2210
|
}
|
|
2213
|
-
const WORD_NAMESPACE = 'http://schemas.openxmlformats.org/wordprocessingml/2006/main';
|
|
2214
|
-
class DocxThemePatchCollector {
|
|
2215
|
-
patches = [];
|
|
2216
|
-
nextMarker = 1;
|
|
2217
|
-
usedColors;
|
|
2218
|
-
constructor(sourceHtml){
|
|
2219
|
-
this.usedColors = sourceColors(sourceHtml);
|
|
2220
|
-
}
|
|
2221
|
-
marker(kind, reference, currentColor) {
|
|
2222
|
-
if (!reference || normalizeColor(currentColor) !== reference.resolved) return null;
|
|
2223
|
-
let marker = '';
|
|
2224
|
-
do {
|
|
2225
|
-
marker = (0xf00000 + this.nextMarker).toString(16).padStart(6, '0').toUpperCase();
|
|
2226
|
-
this.nextMarker += 1;
|
|
2227
|
-
}while (this.usedColors.has(marker))
|
|
2228
|
-
this.usedColors.add(marker);
|
|
2229
|
-
this.patches.push({
|
|
2230
|
-
kind,
|
|
2231
|
-
marker,
|
|
2232
|
-
reference
|
|
2233
|
-
});
|
|
2234
|
-
return marker;
|
|
2235
|
-
}
|
|
2236
|
-
}
|
|
2237
|
-
function serializeDocxThemeReference(reference) {
|
|
2238
|
-
return reference ? JSON.stringify(reference) : void 0;
|
|
2239
|
-
}
|
|
2240
|
-
function parseDocxThemeReference(value) {
|
|
2241
|
-
if (!value) return null;
|
|
2242
|
-
try {
|
|
2243
|
-
const parsed = JSON.parse(value);
|
|
2244
|
-
const theme = 'string' == typeof parsed.theme ? parsed.theme.trim() : '';
|
|
2245
|
-
const resolved = normalizeColor('string' == typeof parsed.resolved ? parsed.resolved : null);
|
|
2246
|
-
const tint = byteHex(parsed.tint);
|
|
2247
|
-
const shade = byteHex(parsed.shade);
|
|
2248
|
-
if (!theme || !resolved) return null;
|
|
2249
|
-
return {
|
|
2250
|
-
theme,
|
|
2251
|
-
resolved,
|
|
2252
|
-
...tint ? {
|
|
2253
|
-
tint
|
|
2254
|
-
} : {},
|
|
2255
|
-
...shade ? {
|
|
2256
|
-
shade
|
|
2257
|
-
} : {}
|
|
2258
|
-
};
|
|
2259
|
-
} catch {
|
|
2260
|
-
return null;
|
|
2261
|
-
}
|
|
2262
|
-
}
|
|
2263
|
-
async function patchDocxThemeReferences(buffer, patches) {
|
|
2264
|
-
if (!patches.length) return buffer;
|
|
2265
|
-
const archive = await jszip.loadAsync(buffer);
|
|
2266
|
-
const byMarker = new Map(patches.map((patch)=>[
|
|
2267
|
-
patch.marker,
|
|
2268
|
-
patch
|
|
2269
|
-
]));
|
|
2270
|
-
const entries = Object.values(archive.files).filter((entry)=>!entry.dir && /^word\/(?:document|header\d+|footer\d+|footnotes|endnotes|comments)\.xml$/.test(entry.name));
|
|
2271
|
-
for (const entry of entries){
|
|
2272
|
-
const document1 = parseXml(await entry.async('text'), entry.name);
|
|
2273
|
-
let changed = false;
|
|
2274
|
-
for (const element of Array.from(document1.getElementsByTagName('*')))for (const target of themePatchTargets(element.localName)){
|
|
2275
|
-
const marker = wordAttribute(element, target.directAttribute)?.toUpperCase();
|
|
2276
|
-
const patch = marker ? byMarker.get(marker) : void 0;
|
|
2277
|
-
if (patch && patch.kind === target.kind) {
|
|
2278
|
-
setWordAttribute(document1, element, target.directAttribute, patch.reference.resolved.slice(1).toUpperCase());
|
|
2279
|
-
setWordAttribute(document1, element, target.themeAttribute, patch.reference.theme);
|
|
2280
|
-
setOptionalWordAttribute(document1, element, target.tintAttribute, patch.reference.tint);
|
|
2281
|
-
setOptionalWordAttribute(document1, element, target.shadeAttribute, patch.reference.shade);
|
|
2282
|
-
changed = true;
|
|
2283
|
-
}
|
|
2284
|
-
}
|
|
2285
|
-
if (changed) archive.file(entry.name, new XMLSerializer().serializeToString(document1));
|
|
2286
|
-
}
|
|
2287
|
-
return archive.generateAsync({
|
|
2288
|
-
type: 'arraybuffer'
|
|
2289
|
-
});
|
|
2290
|
-
}
|
|
2291
|
-
function themePatchTargets(localName) {
|
|
2292
|
-
if ('color' === localName) return [
|
|
2293
|
-
{
|
|
2294
|
-
kind: 'color',
|
|
2295
|
-
directAttribute: 'val',
|
|
2296
|
-
themeAttribute: 'themeColor',
|
|
2297
|
-
tintAttribute: 'themeTint',
|
|
2298
|
-
shadeAttribute: 'themeShade'
|
|
2299
|
-
}
|
|
2300
|
-
];
|
|
2301
|
-
if ('u' === localName) return [
|
|
2302
|
-
{
|
|
2303
|
-
kind: 'underline',
|
|
2304
|
-
directAttribute: 'color',
|
|
2305
|
-
themeAttribute: 'themeColor',
|
|
2306
|
-
tintAttribute: 'themeTint',
|
|
2307
|
-
shadeAttribute: 'themeShade'
|
|
2308
|
-
}
|
|
2309
|
-
];
|
|
2310
|
-
if ('shd' === localName) return [
|
|
2311
|
-
{
|
|
2312
|
-
kind: 'fill',
|
|
2313
|
-
directAttribute: 'fill',
|
|
2314
|
-
themeAttribute: 'themeFill',
|
|
2315
|
-
tintAttribute: 'themeFillTint',
|
|
2316
|
-
shadeAttribute: 'themeFillShade'
|
|
2317
|
-
},
|
|
2318
|
-
{
|
|
2319
|
-
kind: 'shadingColor',
|
|
2320
|
-
directAttribute: 'color',
|
|
2321
|
-
themeAttribute: 'themeColor',
|
|
2322
|
-
tintAttribute: 'themeTint',
|
|
2323
|
-
shadeAttribute: 'themeShade'
|
|
2324
|
-
}
|
|
2325
|
-
];
|
|
2326
|
-
return [
|
|
2327
|
-
'top',
|
|
2328
|
-
'right',
|
|
2329
|
-
'bottom',
|
|
2330
|
-
'left',
|
|
2331
|
-
'start',
|
|
2332
|
-
'end'
|
|
2333
|
-
].includes(localName) ? [
|
|
2334
|
-
{
|
|
2335
|
-
kind: 'border',
|
|
2336
|
-
directAttribute: 'color',
|
|
2337
|
-
themeAttribute: 'themeColor',
|
|
2338
|
-
tintAttribute: 'themeTint',
|
|
2339
|
-
shadeAttribute: 'themeShade'
|
|
2340
|
-
}
|
|
2341
|
-
] : [];
|
|
2342
|
-
}
|
|
2343
|
-
function normalizeColor(value) {
|
|
2344
|
-
const normalized = value?.trim().toLowerCase();
|
|
2345
|
-
if (!normalized || !/^#[0-9a-f]{6}$/.test(normalized)) return null;
|
|
2346
|
-
return normalized;
|
|
2347
|
-
}
|
|
2348
|
-
function sourceColors(source) {
|
|
2349
|
-
const colors = new Set();
|
|
2350
|
-
for (const match of source.matchAll(/#([0-9a-f]{6})\b/gi))if (match[1]) colors.add(match[1].toUpperCase());
|
|
2351
|
-
for (const match of source.matchAll(/rgba?\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)/gi)){
|
|
2352
|
-
const channels = match.slice(1, 4).map(Number);
|
|
2353
|
-
if (!channels.some((channel)=>channel < 0 || channel > 255)) colors.add(channels.map((channel)=>channel.toString(16).padStart(2, '0')).join('').toUpperCase());
|
|
2354
|
-
}
|
|
2355
|
-
return colors;
|
|
2356
|
-
}
|
|
2357
|
-
function byteHex(value) {
|
|
2358
|
-
if ('string' != typeof value) return;
|
|
2359
|
-
const normalized = value.trim().toUpperCase();
|
|
2360
|
-
return /^[0-9A-F]{2}$/.test(normalized) ? normalized : void 0;
|
|
2361
|
-
}
|
|
2362
|
-
function wordAttribute(element, name) {
|
|
2363
|
-
return element.getAttributeNS(WORD_NAMESPACE, name) ?? element.getAttribute(`w:${name}`);
|
|
2364
|
-
}
|
|
2365
|
-
function setWordAttribute(document1, element, name, value) {
|
|
2366
|
-
const prefix = xmlNamespacePrefix(document1.documentElement, WORD_NAMESPACE) ?? 'w';
|
|
2367
|
-
element.setAttributeNS(WORD_NAMESPACE, `${prefix}:${name}`, value);
|
|
2368
|
-
}
|
|
2369
|
-
function setOptionalWordAttribute(document1, element, name, value) {
|
|
2370
|
-
if (value) setWordAttribute(document1, element, name, value);
|
|
2371
|
-
else element.removeAttributeNS(WORD_NAMESPACE, name);
|
|
2372
|
-
}
|
|
2373
|
-
const DOCUMENT_PARAGRAPH_BORDERS_ATTRIBUTE = 'data-office-paragraph-borders';
|
|
2374
|
-
const DOCUMENT_PARAGRAPH_BORDER_EDGES = [
|
|
2375
|
-
'top',
|
|
2376
|
-
'left',
|
|
2377
|
-
'bottom',
|
|
2378
|
-
'right',
|
|
2379
|
-
'between',
|
|
2380
|
-
'bar'
|
|
2381
|
-
];
|
|
2382
|
-
const DOCUMENT_PARAGRAPH_BORDER_STYLES = [
|
|
2383
|
-
'nil',
|
|
2384
|
-
'none',
|
|
2385
|
-
'single',
|
|
2386
|
-
'thick',
|
|
2387
|
-
'double',
|
|
2388
|
-
'dotted',
|
|
2389
|
-
'dashed',
|
|
2390
|
-
'dotDash',
|
|
2391
|
-
'dotDotDash',
|
|
2392
|
-
'triple',
|
|
2393
|
-
'thinThickSmallGap',
|
|
2394
|
-
'thickThinSmallGap',
|
|
2395
|
-
'thinThickThinSmallGap',
|
|
2396
|
-
'thinThickMediumGap',
|
|
2397
|
-
'thickThinMediumGap',
|
|
2398
|
-
'thinThickThinMediumGap',
|
|
2399
|
-
'thinThickLargeGap',
|
|
2400
|
-
'thickThinLargeGap',
|
|
2401
|
-
'thinThickThinLargeGap',
|
|
2402
|
-
'wave',
|
|
2403
|
-
'doubleWave',
|
|
2404
|
-
'dashSmallGap',
|
|
2405
|
-
'dashDotStroked',
|
|
2406
|
-
'threeDEmboss',
|
|
2407
|
-
'threeDEngrave',
|
|
2408
|
-
'outset',
|
|
2409
|
-
'inset',
|
|
2410
|
-
'apples',
|
|
2411
|
-
'archedScallops',
|
|
2412
|
-
'babyPacifier',
|
|
2413
|
-
'babyRattle',
|
|
2414
|
-
'balloons3Colors',
|
|
2415
|
-
'balloonsHotAir',
|
|
2416
|
-
'basicBlackDashes',
|
|
2417
|
-
'basicBlackDots',
|
|
2418
|
-
'basicBlackSquares',
|
|
2419
|
-
'basicThinLines',
|
|
2420
|
-
'basicWhiteDashes',
|
|
2421
|
-
'basicWhiteDots',
|
|
2422
|
-
'basicWhiteSquares',
|
|
2423
|
-
'basicWideInline',
|
|
2424
|
-
'basicWideMidline',
|
|
2425
|
-
'basicWideOutline',
|
|
2426
|
-
'bats',
|
|
2427
|
-
'birds',
|
|
2428
|
-
'birdsFlight',
|
|
2429
|
-
'cabins',
|
|
2430
|
-
'cakeSlice',
|
|
2431
|
-
'candyCorn',
|
|
2432
|
-
'celticKnotwork',
|
|
2433
|
-
'certificateBanner',
|
|
2434
|
-
'chainLink',
|
|
2435
|
-
'champagneBottle',
|
|
2436
|
-
'checkedBarBlack',
|
|
2437
|
-
'checkedBarColor',
|
|
2438
|
-
'checkered',
|
|
2439
|
-
'christmasTree',
|
|
2440
|
-
'circlesLines',
|
|
2441
|
-
'circlesRectangles',
|
|
2442
|
-
'classicalWave',
|
|
2443
|
-
'clocks',
|
|
2444
|
-
'compass',
|
|
2445
|
-
'confetti',
|
|
2446
|
-
'confettiGrays',
|
|
2447
|
-
'confettiOutline',
|
|
2448
|
-
'confettiStreamers',
|
|
2449
|
-
'confettiWhite',
|
|
2450
|
-
'cornerTriangles',
|
|
2451
|
-
'couponCutoutDashes',
|
|
2452
|
-
'couponCutoutDots',
|
|
2453
|
-
'crazyMaze',
|
|
2454
|
-
'creaturesButterfly',
|
|
2455
|
-
'creaturesFish',
|
|
2456
|
-
'creaturesInsects',
|
|
2457
|
-
'creaturesLadyBug',
|
|
2458
|
-
'crossStitch',
|
|
2459
|
-
'cup',
|
|
2460
|
-
'decoArch',
|
|
2461
|
-
'decoArchColor',
|
|
2462
|
-
'decoBlocks',
|
|
2463
|
-
'diamondsGray',
|
|
2464
|
-
'doubleD',
|
|
2465
|
-
'doubleDiamonds',
|
|
2466
|
-
'earth1',
|
|
2467
|
-
'earth2',
|
|
2468
|
-
'eclipsingSquares1',
|
|
2469
|
-
'eclipsingSquares2',
|
|
2470
|
-
'eggsBlack',
|
|
2471
|
-
'fans',
|
|
2472
|
-
'film',
|
|
2473
|
-
'firecrackers',
|
|
2474
|
-
'flowersBlockPrint',
|
|
2475
|
-
'flowersDaisies',
|
|
2476
|
-
'flowersModern1',
|
|
2477
|
-
'flowersModern2',
|
|
2478
|
-
'flowersPansy',
|
|
2479
|
-
'flowersRedRose',
|
|
2480
|
-
'flowersRoses',
|
|
2481
|
-
'flowersTeacup',
|
|
2482
|
-
'flowersTiny',
|
|
2483
|
-
'gems',
|
|
2484
|
-
'gingerbreadMan',
|
|
2485
|
-
'gradient',
|
|
2486
|
-
'handmade1',
|
|
2487
|
-
'handmade2',
|
|
2488
|
-
'heartBalloon',
|
|
2489
|
-
'heartGray',
|
|
2490
|
-
'hearts',
|
|
2491
|
-
'heebieJeebies',
|
|
2492
|
-
'holly',
|
|
2493
|
-
'houseFunky',
|
|
2494
|
-
'hypnotic',
|
|
2495
|
-
'iceCreamCones',
|
|
2496
|
-
'lightBulb',
|
|
2497
|
-
'lightning1',
|
|
2498
|
-
'lightning2',
|
|
2499
|
-
'mapPins',
|
|
2500
|
-
'mapleLeaf',
|
|
2501
|
-
'mapleMuffins',
|
|
2502
|
-
'marquee',
|
|
2503
|
-
'marqueeToothed',
|
|
2504
|
-
'moons',
|
|
2505
|
-
'mosaic',
|
|
2506
|
-
'musicNotes',
|
|
2507
|
-
'northwest',
|
|
2508
|
-
'ovals',
|
|
2509
|
-
'packages',
|
|
2510
|
-
'palmsBlack',
|
|
2511
|
-
'palmsColor',
|
|
2512
|
-
'paperClips',
|
|
2513
|
-
'papyrus',
|
|
2514
|
-
'partyFavor',
|
|
2515
|
-
'partyGlass',
|
|
2516
|
-
'pencils',
|
|
2517
|
-
'people',
|
|
2518
|
-
'peopleWaving',
|
|
2519
|
-
'peopleHats',
|
|
2520
|
-
'poinsettias',
|
|
2521
|
-
'postageStamp',
|
|
2522
|
-
'pumpkin1',
|
|
2523
|
-
'pushPinNote2',
|
|
2524
|
-
'pushPinNote1',
|
|
2525
|
-
'pyramids',
|
|
2526
|
-
'pyramidsAbove',
|
|
2527
|
-
'quadrants',
|
|
2528
|
-
'rings',
|
|
2529
|
-
'safari',
|
|
2530
|
-
'sawtooth',
|
|
2531
|
-
'sawtoothGray',
|
|
2532
|
-
'scaredCat',
|
|
2533
|
-
'seattle',
|
|
2534
|
-
'shadowedSquares',
|
|
2535
|
-
'sharksTeeth',
|
|
2536
|
-
'shorebirdTracks',
|
|
2537
|
-
'skyrocket',
|
|
2538
|
-
'snowflakeFancy',
|
|
2539
|
-
'snowflakes',
|
|
2540
|
-
'sombrero',
|
|
2541
|
-
'southwest',
|
|
2542
|
-
'stars',
|
|
2543
|
-
'starsTop',
|
|
2544
|
-
'stars3d',
|
|
2545
|
-
'starsBlack',
|
|
2546
|
-
'starsShadowed',
|
|
2547
|
-
'sun',
|
|
2548
|
-
'swirligig',
|
|
2549
|
-
'tornPaper',
|
|
2550
|
-
'tornPaperBlack',
|
|
2551
|
-
'trees',
|
|
2552
|
-
'triangleParty',
|
|
2553
|
-
'triangles',
|
|
2554
|
-
'tribal1',
|
|
2555
|
-
'tribal2',
|
|
2556
|
-
'tribal3',
|
|
2557
|
-
'tribal4',
|
|
2558
|
-
'tribal5',
|
|
2559
|
-
'tribal6',
|
|
2560
|
-
'triangle1',
|
|
2561
|
-
'triangle2',
|
|
2562
|
-
'triangleCircle1',
|
|
2563
|
-
'triangleCircle2',
|
|
2564
|
-
'shapes1',
|
|
2565
|
-
'shapes2',
|
|
2566
|
-
'twistedLines1',
|
|
2567
|
-
'twistedLines2',
|
|
2568
|
-
'vine',
|
|
2569
|
-
'waveline',
|
|
2570
|
-
'weavingAngles',
|
|
2571
|
-
'weavingBraid',
|
|
2572
|
-
'weavingRibbon',
|
|
2573
|
-
'weavingStrips',
|
|
2574
|
-
'whiteFlowers',
|
|
2575
|
-
'woodwork',
|
|
2576
|
-
'xIllusions',
|
|
2577
|
-
'zanyTriangles',
|
|
2578
|
-
'zigZag',
|
|
2579
|
-
'zigZagStitch'
|
|
2580
|
-
];
|
|
2581
|
-
const BORDER_STYLE_SET = new Set(DOCUMENT_PARAGRAPH_BORDER_STYLES);
|
|
2582
|
-
const BORDER_EDGE_SET = new Set(DOCUMENT_PARAGRAPH_BORDER_EDGES);
|
|
2583
|
-
const BORDER_PROPERTY_SET = new Set([
|
|
2584
|
-
'style',
|
|
2585
|
-
'color',
|
|
2586
|
-
'size',
|
|
2587
|
-
'space',
|
|
2588
|
-
'shadow',
|
|
2589
|
-
'frame'
|
|
2590
|
-
]);
|
|
2591
|
-
const LINE_BORDER_STYLES = new Set(DOCUMENT_PARAGRAPH_BORDER_STYLES.slice(0, 27));
|
|
2592
|
-
const DASHED_BORDER_STYLES = new Set([
|
|
2593
|
-
'dashed',
|
|
2594
|
-
'dashSmallGap',
|
|
2595
|
-
'dashDotStroked',
|
|
2596
|
-
'dotDash',
|
|
2597
|
-
'dotDotDash'
|
|
2598
|
-
]);
|
|
2599
|
-
const DOUBLE_BORDER_STYLES = new Set([
|
|
2600
|
-
'double',
|
|
2601
|
-
'triple',
|
|
2602
|
-
'thinThickSmallGap',
|
|
2603
|
-
'thickThinSmallGap',
|
|
2604
|
-
'thinThickThinSmallGap',
|
|
2605
|
-
'thinThickMediumGap',
|
|
2606
|
-
'thickThinMediumGap',
|
|
2607
|
-
'thinThickThinMediumGap',
|
|
2608
|
-
'thinThickLargeGap',
|
|
2609
|
-
'thickThinLargeGap',
|
|
2610
|
-
'thinThickThinLargeGap',
|
|
2611
|
-
'doubleWave'
|
|
2612
|
-
]);
|
|
2613
|
-
const MAX_SERIALIZED_PARAGRAPH_BORDERS = 32768;
|
|
2614
|
-
const POINTS_TO_PIXELS = 96 / 72;
|
|
2615
|
-
function normalizeDocumentParagraphBorders(source) {
|
|
2616
|
-
if (!source || 'object' != typeof source || Array.isArray(source)) return null;
|
|
2617
|
-
const record = source;
|
|
2618
|
-
if (Object.keys(record).some((key)=>!BORDER_EDGE_SET.has(key))) return null;
|
|
2619
|
-
const borders = {};
|
|
2620
|
-
for (const edge of DOCUMENT_PARAGRAPH_BORDER_EDGES){
|
|
2621
|
-
if (void 0 === record[edge]) continue;
|
|
2622
|
-
const border = normalizeDocumentParagraphBorder(record[edge]);
|
|
2623
|
-
if (!border) return null;
|
|
2624
|
-
borders[edge] = border;
|
|
2625
|
-
}
|
|
2626
|
-
return Object.keys(borders).length ? borders : null;
|
|
2627
|
-
}
|
|
2628
|
-
function normalizeDocumentParagraphBorder(source) {
|
|
2629
|
-
if (!source || 'object' != typeof source || Array.isArray(source)) return null;
|
|
2630
|
-
const record = source;
|
|
2631
|
-
if (Object.keys(record).some((key)=>!BORDER_PROPERTY_SET.has(key))) return null;
|
|
2632
|
-
const style = record.style;
|
|
2633
|
-
if ('string' != typeof style || !BORDER_STYLE_SET.has(style)) return null;
|
|
2634
|
-
const normalizedStyle = style;
|
|
2635
|
-
const color = normalizeBorderColor(record.color);
|
|
2636
|
-
if (void 0 !== record.color && !color) return null;
|
|
2637
|
-
const size = optionalInteger(record.size);
|
|
2638
|
-
if (null === size || void 0 !== size && !validBorderSize(normalizedStyle, size)) return null;
|
|
2639
|
-
const space = optionalInteger(record.space);
|
|
2640
|
-
if (null === space || void 0 !== space && (space < 0 || space > 31)) return null;
|
|
2641
|
-
const shadow = optionalBoolean(record.shadow);
|
|
2642
|
-
const frame = optionalBoolean(record.frame);
|
|
2643
|
-
if (null === shadow || null === frame) return null;
|
|
2644
|
-
return {
|
|
2645
|
-
style: normalizedStyle,
|
|
2646
|
-
...color ? {
|
|
2647
|
-
color
|
|
2648
|
-
} : {},
|
|
2649
|
-
...void 0 !== size ? {
|
|
2650
|
-
size
|
|
2651
|
-
} : {},
|
|
2652
|
-
...void 0 !== space ? {
|
|
2653
|
-
space
|
|
2654
|
-
} : {},
|
|
2655
|
-
...void 0 !== shadow ? {
|
|
2656
|
-
shadow
|
|
2657
|
-
} : {},
|
|
2658
|
-
...void 0 !== frame ? {
|
|
2659
|
-
frame
|
|
2660
|
-
} : {}
|
|
2661
|
-
};
|
|
2662
|
-
}
|
|
2663
|
-
function parseDocumentParagraphBorders(source) {
|
|
2664
|
-
if ('string' != typeof source) return normalizeDocumentParagraphBorders(source);
|
|
2665
|
-
if (!source.trim() || source.length > MAX_SERIALIZED_PARAGRAPH_BORDERS) return null;
|
|
2666
|
-
try {
|
|
2667
|
-
return normalizeDocumentParagraphBorders(JSON.parse(source));
|
|
2668
|
-
} catch {
|
|
2669
|
-
return null;
|
|
2670
|
-
}
|
|
2671
|
-
}
|
|
2672
|
-
function serializeDocumentParagraphBorders(source) {
|
|
2673
|
-
const borders = normalizeDocumentParagraphBorders(source);
|
|
2674
|
-
if (!borders) return;
|
|
2675
|
-
return JSON.stringify(Object.fromEntries(DOCUMENT_PARAGRAPH_BORDER_EDGES.flatMap((edge)=>{
|
|
2676
|
-
const border = borders[edge];
|
|
2677
|
-
return border ? [
|
|
2678
|
-
[
|
|
2679
|
-
edge,
|
|
2680
|
-
serializedBorder(border)
|
|
2681
|
-
]
|
|
2682
|
-
] : [];
|
|
2683
|
-
})));
|
|
2684
|
-
}
|
|
2685
|
-
function parseDocumentParagraphBordersElement(element) {
|
|
2686
|
-
const semantic = parseDocumentParagraphBorders(element.getAttribute(DOCUMENT_PARAGRAPH_BORDERS_ATTRIBUTE));
|
|
2687
|
-
if (!semantic) return paragraphBordersFromCss(element);
|
|
2688
|
-
const edited = {
|
|
2689
|
-
...semantic
|
|
2690
|
-
};
|
|
2691
|
-
for (const edge of [
|
|
2692
|
-
'top',
|
|
2693
|
-
'left',
|
|
2694
|
-
'bottom',
|
|
2695
|
-
'right'
|
|
2696
|
-
]){
|
|
2697
|
-
const border = semantic[edge];
|
|
2698
|
-
const css = cssBorder(element, edge);
|
|
2699
|
-
if (!(!css || border && sameBorderPresentation(border, css))) {
|
|
2700
|
-
if ('none' === css.style) {
|
|
2701
|
-
edited[edge] = {
|
|
2702
|
-
style: 'nil'
|
|
2703
|
-
};
|
|
2704
|
-
continue;
|
|
2705
|
-
}
|
|
2706
|
-
edited[edge] = {
|
|
2707
|
-
...border ?? {
|
|
2708
|
-
style: 'single'
|
|
2709
|
-
},
|
|
2710
|
-
style: cssStyleToBorderStyle(css.style),
|
|
2711
|
-
color: {
|
|
2712
|
-
value: css.color
|
|
2713
|
-
},
|
|
2714
|
-
size: cssWidthToEighthPoints(css.width)
|
|
2715
|
-
};
|
|
2716
|
-
}
|
|
2717
|
-
}
|
|
2718
|
-
return normalizeDocumentParagraphBorders(edited);
|
|
2719
|
-
}
|
|
2720
|
-
function documentParagraphBordersDomAttributes(source) {
|
|
2721
|
-
const borders = normalizeDocumentParagraphBorders(source);
|
|
2722
|
-
const serialized = serializeDocumentParagraphBorders(borders);
|
|
2723
|
-
if (!borders || !serialized) return {};
|
|
2724
|
-
const styles = [];
|
|
2725
|
-
const shadows = [];
|
|
2726
|
-
for (const edge of [
|
|
2727
|
-
'top',
|
|
2728
|
-
'left',
|
|
2729
|
-
'bottom',
|
|
2730
|
-
'right'
|
|
2731
|
-
]){
|
|
2732
|
-
const border = borders[edge];
|
|
2733
|
-
if (!border) continue;
|
|
2734
|
-
const presentation = documentBorderPresentation(border);
|
|
2735
|
-
styles.push(`border-${edge}: ${formatPixels(presentation.width)}px ${presentation.style} ${presentation.color}`);
|
|
2736
|
-
if (border.space) styles.push(`padding-${edge}: ${formatPixels(border.space * POINTS_TO_PIXELS)}px`);
|
|
2737
|
-
if (border.shadow && presentation.width > 0) shadows.push(`2px 2px 0 ${presentation.color}`);
|
|
2738
|
-
}
|
|
2739
|
-
const between = borders.between ? documentBorderPresentation(borders.between) : null;
|
|
2740
|
-
if (between && between.width > 0) shadows.push(`inset 0 -${formatPixels(between.width)}px 0 ${between.color}`);
|
|
2741
|
-
const bar = borders.bar ? documentBorderPresentation(borders.bar) : null;
|
|
2742
|
-
if (bar && bar.width > 0) shadows.push(`inset ${formatPixels(bar.width)}px 0 0 ${bar.color}`);
|
|
2743
|
-
if (shadows.length) styles.push(`box-shadow: ${shadows.join(', ')}`);
|
|
2744
|
-
return {
|
|
2745
|
-
[DOCUMENT_PARAGRAPH_BORDERS_ATTRIBUTE]: serialized,
|
|
2746
|
-
...styles.length ? {
|
|
2747
|
-
style: styles.join('; ')
|
|
2748
|
-
} : {}
|
|
2749
|
-
};
|
|
2750
|
-
}
|
|
2751
|
-
function isDocumentParagraphArtBorderStyle(style) {
|
|
2752
|
-
return !LINE_BORDER_STYLES.has(style);
|
|
2753
|
-
}
|
|
2754
|
-
function normalizeBorderColor(source) {
|
|
2755
|
-
if (!source || 'object' != typeof source || Array.isArray(source)) return null;
|
|
2756
|
-
const record = source;
|
|
2757
|
-
if (Object.keys(record).some((key)=>'value' !== key && 'theme' !== key)) return null;
|
|
2758
|
-
const theme = parseDocxThemeReference('string' == typeof record.theme ? record.theme : record.theme ? JSON.stringify(record.theme) : void 0);
|
|
2759
|
-
const direct = 'auto' === record.value ? 'auto' : 'string' == typeof record.value ? normalizeCssColor(record.value) : null;
|
|
2760
|
-
const resolved = direct ?? theme?.resolved ?? null;
|
|
2761
|
-
if (!resolved || 'transparent' === resolved) return null;
|
|
2762
|
-
if (theme && resolved !== theme.resolved && !('auto' === resolved && 'none' === theme.theme && '#000000' === theme.resolved)) return null;
|
|
2763
|
-
return {
|
|
2764
|
-
value: resolved,
|
|
2765
|
-
...theme ? {
|
|
2766
|
-
theme
|
|
2767
|
-
} : {}
|
|
2768
|
-
};
|
|
2769
|
-
}
|
|
2770
|
-
function serializedBorder(border) {
|
|
2771
|
-
const color = border.color ? serializedBorderColor(border.color) : void 0;
|
|
2772
|
-
return {
|
|
2773
|
-
style: border.style,
|
|
2774
|
-
...color ? {
|
|
2775
|
-
color
|
|
2776
|
-
} : {},
|
|
2777
|
-
...void 0 !== border.size ? {
|
|
2778
|
-
size: border.size
|
|
2779
|
-
} : {},
|
|
2780
|
-
...void 0 !== border.space ? {
|
|
2781
|
-
space: border.space
|
|
2782
|
-
} : {},
|
|
2783
|
-
...void 0 !== border.shadow ? {
|
|
2784
|
-
shadow: border.shadow
|
|
2785
|
-
} : {},
|
|
2786
|
-
...void 0 !== border.frame ? {
|
|
2787
|
-
frame: border.frame
|
|
2788
|
-
} : {}
|
|
2789
|
-
};
|
|
2790
|
-
}
|
|
2791
|
-
function serializedBorderColor(color) {
|
|
2792
|
-
const theme = serializeDocxThemeReference(color.theme ?? null);
|
|
2793
|
-
return {
|
|
2794
|
-
value: color.value,
|
|
2795
|
-
...theme ? {
|
|
2796
|
-
theme: JSON.parse(theme)
|
|
2797
|
-
} : {}
|
|
2798
|
-
};
|
|
2799
|
-
}
|
|
2800
|
-
function optionalInteger(value) {
|
|
2801
|
-
if (void 0 === value) return;
|
|
2802
|
-
return 'number' == typeof value && Number.isSafeInteger(value) ? value : null;
|
|
2803
|
-
}
|
|
2804
|
-
function optionalBoolean(value) {
|
|
2805
|
-
if (void 0 === value) return;
|
|
2806
|
-
return 'boolean' == typeof value ? value : null;
|
|
2807
|
-
}
|
|
2808
|
-
function validBorderSize(style, size) {
|
|
2809
|
-
if ('nil' === style || 'none' === style) return size >= 0 && size <= 96;
|
|
2810
|
-
return isDocumentParagraphArtBorderStyle(style) ? size >= 1 && size <= 31 : size >= 2 && size <= 96;
|
|
2811
|
-
}
|
|
2812
|
-
function documentBorderPresentation(border) {
|
|
2813
|
-
if ('nil' === border.style || 'none' === border.style || !border.size) return {
|
|
2814
|
-
color: 'transparent',
|
|
2815
|
-
style: 'none',
|
|
2816
|
-
width: 0
|
|
2817
|
-
};
|
|
2818
|
-
const width = Math.min(16, isDocumentParagraphArtBorderStyle(border.style) ? border.size * POINTS_TO_PIXELS : border.size / 6);
|
|
2819
|
-
return {
|
|
2820
|
-
color: border.color && 'auto' !== border.color.value ? border.color.value : '#000000',
|
|
2821
|
-
style: borderStyleToCssStyle(border.style),
|
|
2822
|
-
width
|
|
2823
|
-
};
|
|
2824
|
-
}
|
|
2825
|
-
function borderStyleToCssStyle(style) {
|
|
2826
|
-
if ('nil' === style || 'none' === style) return 'none';
|
|
2827
|
-
if ('dotted' === style) return 'dotted';
|
|
2828
|
-
if (DASHED_BORDER_STYLES.has(style)) return 'dashed';
|
|
2829
|
-
if (DOUBLE_BORDER_STYLES.has(style)) return 'double';
|
|
2830
|
-
if ('inset' === style || 'threeDEngrave' === style) return 'inset';
|
|
2831
|
-
if ('outset' === style || 'threeDEmboss' === style) return 'outset';
|
|
2832
|
-
return 'solid';
|
|
2833
|
-
}
|
|
2834
|
-
function paragraphBordersFromCss(element) {
|
|
2835
|
-
const borders = {};
|
|
2836
|
-
for (const edge of [
|
|
2837
|
-
'top',
|
|
2838
|
-
'left',
|
|
2839
|
-
'bottom',
|
|
2840
|
-
'right'
|
|
2841
|
-
]){
|
|
2842
|
-
const css = cssBorder(element, edge);
|
|
2843
|
-
if (css && 'none' !== css.style) borders[edge] = {
|
|
2844
|
-
style: cssStyleToBorderStyle(css.style),
|
|
2845
|
-
color: {
|
|
2846
|
-
value: css.color
|
|
2847
|
-
},
|
|
2848
|
-
size: cssWidthToEighthPoints(css.width)
|
|
2849
|
-
};
|
|
2850
|
-
}
|
|
2851
|
-
return normalizeDocumentParagraphBorders(borders);
|
|
2852
|
-
}
|
|
2853
|
-
function cssBorder(element, edge) {
|
|
2854
|
-
const style = element.style.getPropertyValue(`border-${edge}-style`).trim();
|
|
2855
|
-
const width = Number.parseFloat(element.style.getPropertyValue(`border-${edge}-width`));
|
|
2856
|
-
const color = normalizeCssColor(element.style.getPropertyValue(`border-${edge}-color`));
|
|
2857
|
-
if (!style) return null;
|
|
2858
|
-
if ('none' === style || 'hidden' === style) return {
|
|
2859
|
-
color: '#000000',
|
|
2860
|
-
style: 'none',
|
|
2861
|
-
width: 0
|
|
2862
|
-
};
|
|
2863
|
-
return color && 'transparent' !== color && Number.isFinite(width) && width > 0 ? {
|
|
2864
|
-
color,
|
|
2865
|
-
style,
|
|
2866
|
-
width
|
|
2867
|
-
} : null;
|
|
2868
|
-
}
|
|
2869
|
-
function sameBorderPresentation(border, css) {
|
|
2870
|
-
const expected = documentBorderPresentation(border);
|
|
2871
|
-
if ('none' === expected.style) return 'none' === css.style && 0 === css.width;
|
|
2872
|
-
return expected.color === css.color && expected.style === css.style && Math.abs(expected.width - css.width) < 0.01;
|
|
2873
|
-
}
|
|
2874
|
-
function cssStyleToBorderStyle(style) {
|
|
2875
|
-
if ('double' === style) return 'double';
|
|
2876
|
-
if ('dashed' === style) return 'dashed';
|
|
2877
|
-
if ('dotted' === style) return 'dotted';
|
|
2878
|
-
if ('inset' === style || 'groove' === style) return 'inset';
|
|
2879
|
-
if ('outset' === style || 'ridge' === style) return 'outset';
|
|
2880
|
-
return 'single';
|
|
2881
|
-
}
|
|
2882
|
-
function cssWidthToEighthPoints(width) {
|
|
2883
|
-
return Math.max(2, Math.min(96, Math.round(6 * width)));
|
|
2884
|
-
}
|
|
2885
|
-
function formatPixels(value) {
|
|
2886
|
-
return Number(value.toFixed(3)).toString();
|
|
2887
|
-
}
|
|
2888
2211
|
const DOCUMENT_PAGE_BORDER_EDGES = [
|
|
2889
2212
|
'top',
|
|
2890
2213
|
'left',
|
|
@@ -2912,7 +2235,7 @@ const PAGE_BORDER_Z_ORDER_SET = new Set([
|
|
|
2912
2235
|
'back'
|
|
2913
2236
|
]);
|
|
2914
2237
|
const MAX_SERIALIZED_PAGE_BORDERS = 32768;
|
|
2915
|
-
const
|
|
2238
|
+
const POINTS_TO_PIXELS = 96 / 72;
|
|
2916
2239
|
function normalizeDocumentPageBorders(source) {
|
|
2917
2240
|
if (!source || 'object' != typeof source || Array.isArray(source)) return null;
|
|
2918
2241
|
const record = source;
|
|
@@ -2994,7 +2317,7 @@ function resolveDocumentPageBorders(source, margins) {
|
|
|
2994
2317
|
const border = borders.edges[edge];
|
|
2995
2318
|
const presentation = border ? documentBorderPresentation(border) : void 0;
|
|
2996
2319
|
if (presentation) presentations[edge] = presentation;
|
|
2997
|
-
const space = (border?.space ?? 0) *
|
|
2320
|
+
const space = (border?.space ?? 0) * POINTS_TO_PIXELS;
|
|
2998
2321
|
insets[edge] = 'page' === offsetFrom ? space : Math.max(0, millimetersToPixels(margins[edge]) - space - (presentation?.width ?? 0));
|
|
2999
2322
|
}
|
|
3000
2323
|
return {
|
|
@@ -9029,6 +8352,8 @@ function sanitizeAttributes(element, tag) {
|
|
|
9029
8352
|
const hiddenText = 'span' === tag ? documentHiddenTextFromElement(element) : null;
|
|
9030
8353
|
const legacyTextEffects = 'span' === tag ? documentLegacyTextEffectsFromElement(element) ?? {} : {};
|
|
9031
8354
|
const legacyTextEffectAttributes = documentLegacyTextEffectsDomAttributes(legacyTextEffects);
|
|
8355
|
+
const runBorder = 'span' === tag ? parseDocumentRunBorderElement(element) : null;
|
|
8356
|
+
const runBorderAttributes = documentRunBorderDomAttributes(runBorder);
|
|
9032
8357
|
const underline = 'u' === tag ? documentUnderlineFormattingFromElement(element) : null;
|
|
9033
8358
|
const underlineAttributes = underline ? documentUnderlineDomAttributes(underline) : {};
|
|
9034
8359
|
const strike = 's' === tag || 'strike' === tag ? documentStrikeFormattingFromElement(element) : null;
|
|
@@ -9055,6 +8380,7 @@ function sanitizeAttributes(element, tag) {
|
|
|
9055
8380
|
element.removeAttribute(DOCUMENT_LEGACY_TEXT_SHADOW_ATTRIBUTE);
|
|
9056
8381
|
element.removeAttribute(DOCUMENT_LEGACY_TEXT_EMBOSS_ATTRIBUTE);
|
|
9057
8382
|
element.removeAttribute(DOCUMENT_LEGACY_TEXT_IMPRINT_ATTRIBUTE);
|
|
8383
|
+
element.removeAttribute(DOCUMENT_RUN_BORDER_ATTRIBUTE);
|
|
9058
8384
|
element.removeAttribute(DOCUMENT_SCRIPT_FONTS_ATTRIBUTE);
|
|
9059
8385
|
element.removeAttribute(DOCUMENT_SCRIPT_FONT_SLOT_ATTRIBUTE);
|
|
9060
8386
|
const styles = [
|
|
@@ -9070,6 +8396,7 @@ function sanitizeAttributes(element, tag) {
|
|
|
9070
8396
|
emphasisAttributes.style ?? '',
|
|
9071
8397
|
underlineAttributes.style ?? '',
|
|
9072
8398
|
strikeAttributes.style ?? '',
|
|
8399
|
+
runBorderAttributes.style ?? '',
|
|
9073
8400
|
borderAttributes.style ?? '',
|
|
9074
8401
|
shadingAttributes.style ?? ''
|
|
9075
8402
|
].filter(Boolean);
|
|
@@ -9116,7 +8443,11 @@ function sanitizeAttributes(element, tag) {
|
|
|
9116
8443
|
if ('span' === tag && null !== kerningThreshold) element.setAttribute(DOCUMENT_KERNING_THRESHOLD_ATTRIBUTE, String(kerningThreshold));
|
|
9117
8444
|
if ('span' === tag && null !== emphasisMark) element.setAttribute(DOCUMENT_EMPHASIS_MARK_ATTRIBUTE, emphasisMark);
|
|
9118
8445
|
if ('span' === tag && null !== hiddenText) element.setAttribute(DOCUMENT_HIDDEN_TEXT_ATTRIBUTE, String(hiddenText));
|
|
9119
|
-
if ('span' === tag)
|
|
8446
|
+
if ('span' === tag) {
|
|
8447
|
+
for (const [name, value] of Object.entries(legacyTextEffectAttributes))element.setAttribute(name, value);
|
|
8448
|
+
const serializedRunBorder = runBorderAttributes[DOCUMENT_RUN_BORDER_ATTRIBUTE];
|
|
8449
|
+
if (serializedRunBorder) element.setAttribute(DOCUMENT_RUN_BORDER_ATTRIBUTE, serializedRunBorder);
|
|
8450
|
+
}
|
|
9120
8451
|
if ('span' === tag && scriptFonts) {
|
|
9121
8452
|
for (const [name, value] of Object.entries(scriptFontAttributes))if ('style' !== name) element.setAttribute(name, value);
|
|
9122
8453
|
}
|
|
@@ -9169,6 +8500,7 @@ function sanitizeAttributes(element, tag) {
|
|
|
9169
8500
|
DOCUMENT_LEGACY_TEXT_SHADOW_ATTRIBUTE,
|
|
9170
8501
|
DOCUMENT_LEGACY_TEXT_EMBOSS_ATTRIBUTE,
|
|
9171
8502
|
DOCUMENT_LEGACY_TEXT_IMPRINT_ATTRIBUTE,
|
|
8503
|
+
DOCUMENT_RUN_BORDER_ATTRIBUTE,
|
|
9172
8504
|
DOCUMENT_SCRIPT_FONTS_ATTRIBUTE,
|
|
9173
8505
|
DOCUMENT_SCRIPT_FONT_SLOT_ATTRIBUTE
|
|
9174
8506
|
] : [],
|
|
@@ -10100,6 +9432,7 @@ const ALLOWED_ATTRIBUTES = {
|
|
|
10100
9432
|
'legacyTextShadow',
|
|
10101
9433
|
'legacyTextEmboss',
|
|
10102
9434
|
'legacyTextImprint',
|
|
9435
|
+
'runBorder',
|
|
10103
9436
|
"scriptFonts",
|
|
10104
9437
|
"scriptFontSlot",
|
|
10105
9438
|
'themeColor',
|
|
@@ -10195,6 +9528,7 @@ function importedDocumentCharacterFormatting(formatting) {
|
|
|
10195
9528
|
legacyTextShadow: formatting.legacyTextShadow,
|
|
10196
9529
|
legacyTextEmboss: formatting.legacyTextEmboss,
|
|
10197
9530
|
legacyTextImprint: formatting.legacyTextImprint,
|
|
9531
|
+
runBorder: formatting.runBorder,
|
|
10198
9532
|
color: formatting.color,
|
|
10199
9533
|
fontFamily: formatting.fontFamily,
|
|
10200
9534
|
scriptFonts: serializeDocumentScriptFonts(formatting.scriptFonts) ?? void 0,
|
|
@@ -10288,6 +9622,12 @@ function normalizeCharacterFormatMark(value) {
|
|
|
10288
9622
|
attrs[key] = slot;
|
|
10289
9623
|
continue;
|
|
10290
9624
|
}
|
|
9625
|
+
if ('textStyle' === type && 'runBorder' === key) {
|
|
9626
|
+
const border = serializeDocumentRunBorder(parseDocumentRunBorder(candidate));
|
|
9627
|
+
if (!border) return null;
|
|
9628
|
+
attrs[key] = border;
|
|
9629
|
+
continue;
|
|
9630
|
+
}
|
|
10291
9631
|
if ('string' == typeof candidate) {
|
|
10292
9632
|
if (!candidate.length) continue;
|
|
10293
9633
|
if ('textStyle' === type && 'textCase' === key && !normalizeDocumentTextCase(candidate)) return null;
|
|
@@ -11231,6 +10571,28 @@ const DocumentCharacterFormatting = Extension.create({
|
|
|
11231
10571
|
toggleDocumentTextCase: (textCase)=>({ commands, editor })=>{
|
|
11232
10572
|
const current = normalizeDocumentTextCase(editor.getAttributes('textStyle').textCase) ?? 'none';
|
|
11233
10573
|
return commands.setDocumentTextCase(current === textCase ? 'none' : textCase);
|
|
10574
|
+
},
|
|
10575
|
+
setDocumentRunBorder: (border)=>({ commands })=>{
|
|
10576
|
+
const serialized = serializeDocumentRunBorder(normalizeDocumentRunBorder(border));
|
|
10577
|
+
return serialized ? commands.setMark('textStyle', {
|
|
10578
|
+
runBorder: serialized
|
|
10579
|
+
}) : false;
|
|
10580
|
+
},
|
|
10581
|
+
unsetDocumentRunBorder: ()=>({ chain })=>chain().setMark('textStyle', {
|
|
10582
|
+
runBorder: null
|
|
10583
|
+
}).removeEmptyTextStyle().run(),
|
|
10584
|
+
toggleDocumentRunBorder: ()=>({ commands, editor })=>{
|
|
10585
|
+
const current = parseDocumentRunBorder(editor.getAttributes('textStyle').runBorder);
|
|
10586
|
+
return commands.setDocumentRunBorder(documentRunBorderIsVisible(current) ? {
|
|
10587
|
+
style: 'nil'
|
|
10588
|
+
} : {
|
|
10589
|
+
style: 'single',
|
|
10590
|
+
color: {
|
|
10591
|
+
value: 'auto'
|
|
10592
|
+
},
|
|
10593
|
+
size: 4,
|
|
10594
|
+
space: 1
|
|
10595
|
+
});
|
|
11234
10596
|
}
|
|
11235
10597
|
};
|
|
11236
10598
|
},
|
|
@@ -15970,7 +15332,7 @@ function documentTextParagraphStyle(style) {
|
|
|
15970
15332
|
function documentTextLayoutRunStyle(style, fonts, loadedFontIds, paragraphStyle, element, paragraphRoot) {
|
|
15971
15333
|
const direction = 'rtl' === style.direction ? 'rtl' : 'ltr';
|
|
15972
15334
|
const whiteSpace = 'break-spaces' === style.whiteSpace ? 'breakSpaces' : 'normal';
|
|
15973
|
-
if (direction !== paragraphStyle.direction || whiteSpace !== paragraphStyle.whiteSpace || !cssValueIs(style.whiteSpace, 'normal', 'break-spaces') || !cssValueIs(style.overflowWrap, 'normal', 'anywhere', 'break-word') || !cssValueIs(style.wordBreak, 'normal') || !cssValueIs(style.hyphens, 'manual', 'none') || !cssValueIs(style.wordSpacing, 'normal', '0', '0px') || !cssValueIs(style.textTransform, 'none') || !cssValueIs(style.fontVariationSettings, 'normal') || !cssValueIs(style.fontVariantCaps, 'normal') || !cssValueIs(style.fontVariantEastAsian, 'normal') || !cssValueIs(style.fontVariantNumeric, 'normal') || !cssValueIs(style.fontVariantPosition, 'normal') || !cssValueIs(style.fontStretch, 'normal', '100%') || !documentTextEmphasisAllowsKernel(style, element) || !cssValueIs(style.verticalAlign, 'baseline') || !cssValueIs(style.unicodeBidi, 'normal') && !(paragraphRoot && 'isolate' === style.unicodeBidi)) return null;
|
|
15335
|
+
if (direction !== paragraphStyle.direction || whiteSpace !== paragraphStyle.whiteSpace || !cssValueIs(style.whiteSpace, 'normal', 'break-spaces') || !cssValueIs(style.overflowWrap, 'normal', 'anywhere', 'break-word') || !cssValueIs(style.wordBreak, 'normal') || !cssValueIs(style.hyphens, 'manual', 'none') || !cssValueIs(style.wordSpacing, 'normal', '0', '0px') || !cssValueIs(style.textTransform, 'none') || !cssValueIs(style.fontVariationSettings, 'normal') || !cssValueIs(style.fontVariantCaps, 'normal') || !cssValueIs(style.fontVariantEastAsian, 'normal') || !cssValueIs(style.fontVariantNumeric, 'normal') || !cssValueIs(style.fontVariantPosition, 'normal') || !cssValueIs(style.fontStretch, 'normal', '100%') || !documentTextEmphasisAllowsKernel(style, element) || !documentRunBorderAllowsKernel(element) || !cssValueIs(style.verticalAlign, 'baseline') || !cssValueIs(style.unicodeBidi, 'normal') && !(paragraphRoot && 'isolate' === style.unicodeBidi)) return null;
|
|
15974
15336
|
const fontStyle = style.fontStyle && 'normal' !== style.fontStyle ? 'italic' === style.fontStyle ? 'italic' : null : 'normal';
|
|
15975
15337
|
if (!fontStyle) return null;
|
|
15976
15338
|
const families = cssFontFamilies(style.fontFamily);
|
|
@@ -16056,6 +15418,10 @@ function documentTextEmphasisAllowsKernel(style, element) {
|
|
|
16056
15418
|
const webkit = style.getPropertyValue('-webkit-text-emphasis-style').trim();
|
|
16057
15419
|
return (!standard || 'none' === standard) && (!webkit || 'none' === webkit);
|
|
16058
15420
|
}
|
|
15421
|
+
function documentRunBorderAllowsKernel(element) {
|
|
15422
|
+
for(let current = element; current; current = current.parentElement)if (current.hasAttribute(DOCUMENT_RUN_BORDER_ATTRIBUTE)) return !documentRunBorderIsVisible(parseDocumentRunBorder(current.getAttribute(DOCUMENT_RUN_BORDER_ATTRIBUTE)));
|
|
15423
|
+
return true;
|
|
15424
|
+
}
|
|
16059
15425
|
function cssLigatures(style) {
|
|
16060
15426
|
const variant = style.fontVariantLigatures;
|
|
16061
15427
|
if (variant && 'normal' !== variant && 'none' !== variant) return null;
|
|
@@ -17622,7 +16988,11 @@ const DocumentTextStyle = TextStyle.extend({
|
|
|
17622
16988
|
].map((attribute)=>({
|
|
17623
16989
|
tag: `span[${attribute}]`,
|
|
17624
16990
|
consuming: false
|
|
17625
|
-
}))
|
|
16991
|
+
})),
|
|
16992
|
+
{
|
|
16993
|
+
tag: `span[${DOCUMENT_RUN_BORDER_ATTRIBUTE}]`,
|
|
16994
|
+
consuming: false
|
|
16995
|
+
}
|
|
17626
16996
|
];
|
|
17627
16997
|
},
|
|
17628
16998
|
addCommands () {
|
|
@@ -17671,6 +17041,11 @@ const DocumentTextStyle = TextStyle.extend({
|
|
|
17671
17041
|
legacyTextShadow: legacyTextEffectAttribute('shadow'),
|
|
17672
17042
|
legacyTextEmboss: legacyTextEffectAttribute('emboss'),
|
|
17673
17043
|
legacyTextImprint: legacyTextEffectAttribute('imprint'),
|
|
17044
|
+
runBorder: {
|
|
17045
|
+
default: null,
|
|
17046
|
+
parseHTML: (element)=>serializeDocumentRunBorder(parseDocumentRunBorderElement(element)) ?? null,
|
|
17047
|
+
renderHTML: (attributes)=>documentRunBorderDomAttributes(parseDocumentRunBorder(attributes.runBorder))
|
|
17048
|
+
},
|
|
17674
17049
|
kerningThresholdHalfPoints: {
|
|
17675
17050
|
default: null,
|
|
17676
17051
|
parseHTML: (element)=>documentKerningThresholdHalfPointsFromElement(element),
|
|
@@ -21866,4 +21241,4 @@ function registerDocumentPageSurfaceGeometry(element, provider) {
|
|
|
21866
21241
|
function documentPageSurfaceGeometryForElement(element) {
|
|
21867
21242
|
return documentPageSurfaceProviders.get(element)?.() ?? null;
|
|
21868
21243
|
}
|
|
21869
|
-
export { DEFAULT_DOCUMENT_TABLE_CELL_FORMAT, DEFAULT_DOCUMENT_TABLE_CELL_MARGINS, DEFAULT_DOCUMENT_TABLE_GEOMETRY, DOCUMENT_BOOKMARK_DUPLICATE_MESSAGE, DOCUMENT_CHUNK_HYDRATION_META, DOCUMENT_CHUNK_PAGINATION_META, DOCUMENT_CHUNK_VISIBLE_IDS_META, DOCUMENT_LEGACY_TEXT_EFFECT_NAMES, DOCUMENT_LEGACY_TEXT_EMBOSS_ATTRIBUTE, DOCUMENT_LEGACY_TEXT_IMPRINT_ATTRIBUTE, DOCUMENT_LEGACY_TEXT_OUTLINE_ATTRIBUTE, DOCUMENT_LEGACY_TEXT_SHADOW_ATTRIBUTE, DOCUMENT_PAGE_BORDER_EDGES, DOCUMENT_PAGE_MARGIN_KEYS,
|
|
21244
|
+
export { DEFAULT_DOCUMENT_TABLE_CELL_FORMAT, DEFAULT_DOCUMENT_TABLE_CELL_MARGINS, DEFAULT_DOCUMENT_TABLE_GEOMETRY, DOCUMENT_BOOKMARK_DUPLICATE_MESSAGE, DOCUMENT_CHUNK_HYDRATION_META, DOCUMENT_CHUNK_PAGINATION_META, DOCUMENT_CHUNK_VISIBLE_IDS_META, DOCUMENT_LEGACY_TEXT_EFFECT_NAMES, DOCUMENT_LEGACY_TEXT_EMBOSS_ATTRIBUTE, DOCUMENT_LEGACY_TEXT_IMPRINT_ATTRIBUTE, DOCUMENT_LEGACY_TEXT_OUTLINE_ATTRIBUTE, DOCUMENT_LEGACY_TEXT_SHADOW_ATTRIBUTE, DOCUMENT_PAGE_BORDER_EDGES, DOCUMENT_PAGE_MARGIN_KEYS, DOCUMENT_PARAGRAPH_SHADING_PATTERNS, DOCUMENT_STRIKE_STYLE_ATTRIBUTE, DOCUMENT_TABLE_ROW_ID_ATTRIBUTE, DOCUMENT_TABLE_ROW_TEXT_ID_ATTRIBUTE, DOCUMENT_TABLE_STYLE_OPTIONS, DOCUMENT_UNDERLINE_STYLE_ATTRIBUTE, DocumentCharacterFormatting, DocumentEquation, DocumentFontFamily, DocumentImage, DocumentParagraphFormatting, DocumentParagraphIdentity, DocumentScriptFontFormatting, DocumentStrike, DocumentSubscript, DocumentSuperscript, DocumentTableRowIdentity, DocumentTextStyle, DocumentUnderline, MAX_DOCUMENT_IMAGE_RELATIVE_HEIGHT, MAX_DOCUMENT_NUMBERING_START, activeDocumentBookmark, activeDocumentSection, activeDocumentTableStyle, applyDocumentImageCropToElement, applyDocumentImageIdentityToElement, applyDocumentImageLayerToElement, applyDocumentImageWrapContourToElement, applyDocumentPageGeometry, applyDocumentParagraphIdentityToElement, applyDocumentTableGeometryToElement, applyDocumentTableRowIdentityToElement, applyDocumentTextCaseStyle, canChangeDocumentIndent, canInsertDocumentComment, canSetDocumentTableRowRepeatHeader, clampDocumentMargin, collectDocumentChanges, collectDocumentCommentAnchors, collectDocumentNotes, collectDocumentTextLayoutParagraphs, createDocumentBibliography, createDocumentEquationElement, createDocumentImageIdentityRegistry, createDocumentNoteElement, createDocumentParagraphIdentityRegistry, createSchemaDerivedWorkDocumentModel, createSchemaValidatedWorkDocumentModel, createWorkDocumentExtensions, createWorkDocumentModel, createWorkDocumentModelFromContent, createWorkOfficeDocumentCollaborationBinding as createOfficeDocumentCollaborationBinding, cssDocumentFontFamily, defaultDocumentImageWrapContour, documentAutoLineHeight, documentBookmarkNameExists, documentBookmarkReferenceInstruction, documentBulletListStyle, documentCaptionKind, documentCaptionLabel, documentCharacterPositionDomAttributes, documentCharacterPositionHalfPointsFromElement, documentCharacterPositionPoints, documentCharacterScaleDomAttributes, documentCharacterScalePercentFromElement, documentCharacterSpacingDomAttributes, documentCharacterSpacingPoints, documentCharacterSpacingTwipsFromElement, documentChunkMountedIds, documentCitationCount, documentCitationInstruction, documentCitationStyle, documentCitationStyleDetails, documentCitationTags, documentCitationTagsFromInstruction, documentCommentDraftRange, documentCommentViews, documentContentLayoutProperties, documentEmphasisMarkDomAttributes, documentEmphasisMarkFromElement, documentEquationFromElement, documentEquationText, documentFontNameFromCssFamily, documentHiddenTextDomAttributes, documentHiddenTextFromElement, documentHiddenTextKeyboardShortcut, documentImageCropFromElement, documentImageIdentityFromElement, documentImageLayerFromElement, documentImageLayoutFromElement, documentImageLayoutOptions, documentImagePositionFromElement, documentImageProperties, documentImageWrapContourFromElement, documentInitialSectionLayout, documentKerningDomAttributes, documentKerningIsEffective, documentKerningThresholdHalfPointsFromElement, documentKerningThresholdPoints, documentLazyHtmlChunkFragment, documentLazyHtmlProjection, documentLazyHtmlProjectionFingerprint, documentLegacyTextEffectsConflict, documentLegacyTextEffectsCss, documentLegacyTextEffectsDomAttributes, documentLegacyTextEffectsFromElement, documentLegacyTextEffectsFromTextStyleAttributes, documentModelForContent, documentModelForHtml, documentModelHasTrustedInitialIntegrityFeatures, documentModelUsesWindowing, documentNoteKey, documentNoteKind, documentOrderedListState, documentPageBordersVisible, documentPageChromeLegacyFields, documentPageGeometryForLayout, documentPageHorizontalMarginTwips, documentPageMarginBody, documentPageMarginsForLayout, documentPageMetrics, documentPageSurfaceGeometryForElement, documentPaperSizeForGeometry, documentParagraphDirection, documentParagraphIdentityFromElement, documentParagraphIndent, documentParagraphPagination, documentParagraphShadingDomAttributes, documentParagraphSpacing, documentParagraphTabStops, documentScriptFontDirectFamily, documentScriptFontFallbackSlots, documentScriptFontFamily, documentScriptFontFamilyForRendering, documentScriptFontSegments, documentScriptFontSlotFromElement, documentScriptFontSlotFromHint, documentScriptFontsDomAttributes, documentScriptFontsFromElement, documentSectionById, documentSectionDomAttributes, documentSections, documentStrikeDomAttributes, documentStrikeFormattingFromElement, documentStrikeStyle, documentTabLeaderLabel, documentTableBordersFromElement, documentTableCellFormat, documentTableCellMarginOverridesFromElement, documentTableColumnPercentagesFromElement, documentTableGeometryFromElement, documentTableHorizontalAlignment, documentTableRowIdentityFromElement, documentTableRowOptions, documentTableSizing, documentTextCaseFromWordFlags, documentTextCaseKeyboardShortcuts, documentTextLayoutBatches, documentTextStatistics, documentTransactionsOnlyHydrateChunks, documentUnderlineColor, documentUnderlineDomAttributes, documentUnderlineFormattingFromElement, documentUnderlineKeyboardShortcuts, documentUnderlineStyle, documentWordLineHeightFactor, docxBookmarkReferenceTarget, docxDocumentFieldKind, editorDocumentBookmarkReferenceTargets, editorDocumentCaptionTargets, importedDocumentCharacterFormatting, initializeWorkOfficeDocumentCollaboration as initializeOfficeDocumentCollaboration, invalidateDocumentLazyHtmlProjection, isContourImageLayout, isValidDocumentCitationTag, materializeLazyDocumentEditorRoot, materializeWorkDocumentContent, measureDocumentLayoutBlocksIncrementally, millimetersToPixels, mountWorkLiveDocumentCapture, nextDocumentTabAlignment, normalizeDocumentBookmarkName, normalizeDocumentBookmarkNativeId, normalizeDocumentBookmarkReferencesHtml, normalizeDocumentBookmarksHtml, normalizeDocumentCaptionsHtml, normalizeDocumentCharacterPositionHalfPoints, normalizeDocumentCharacterScalePercent, normalizeDocumentCharacterSpacingTwips, normalizeDocumentCitationsHtml, normalizeDocumentColumns, normalizeDocumentEmphasisMark, normalizeDocumentEquation, normalizeDocumentFieldsHtml, normalizeDocumentFontName, normalizeDocumentHiddenText, normalizeDocumentHtml, normalizeDocumentImageAlignment, normalizeDocumentImageCrop, normalizeDocumentImageIdentity, normalizeDocumentImageLayer, normalizeDocumentImageLayoutOptions, normalizeDocumentImagePosition, normalizeDocumentImageWrapContour, normalizeDocumentImageWrapSide, normalizeDocumentKerningThresholdHalfPoints, normalizeDocumentLegacyTextEffect, normalizeDocumentLegacyTextEffects, normalizeDocumentNotesHtml, normalizeDocumentPageBorders, normalizeDocumentPageChrome, normalizeDocumentPageGeometry, normalizeDocumentPageMargins, normalizeDocumentPaperSource, normalizeDocumentParagraphId, normalizeDocumentParagraphIdentity, normalizeDocumentParagraphIndent, normalizeDocumentScriptFontHint, normalizeDocumentScriptFontSlot, normalizeDocumentScriptFonts, normalizeDocumentStrikeStyle, normalizeDocumentTabStops, normalizeDocumentTableBorderStyle, normalizeDocumentTableBorderWidth, normalizeDocumentTableRowHeightRule, normalizeDocumentTableRowIdentity, normalizeDocumentTableVerticalAlign, normalizeDocumentTextCase, normalizeDocumentThemeFont, normalizeDocumentUnderlineColor, normalizeDocumentUnderlineStyle, normalizeTableColor, normalizedTabPosition, pageTwipsToMillimeters, parseDocumentCharacterFormatting, parseDocumentParagraphFormatting, parseDocumentParagraphShadingElement, parseDocumentScriptFonts, patchDocumentLazyHtmlProjection, patchDocumentScriptFonts, positionWorkLiveDocumentCapture, readWorkOfficeDocumentCollaboration as readOfficeDocumentCollaboration, registerDocumentPageSurfaceGeometry, renderDocumentAutoLineHeight, renderDocumentTableBorders, renderDocumentTableCellMarginOverrides, resolveDocumentPageBorders, resolveDocumentPageChrome, resolveDocumentPageMargins, resolveDocumentPageSize, resolveWorkDocumentEditorInput, retainAnchoredDocumentComments, sanitizeDocumentPageChromeHtml, selectedDocumentChunkId, serializeDocumentParagraphFormatting, serializeDocumentScriptFonts, serializeDocumentTabStops, serializeWorkDocumentNode, setCustomDocumentColumns, supportedDocxBookmarkReferenceInstruction, syncDocumentContentFromHtml, transferChangedDocumentTextStatistics, uniqueDocumentImageIdentity, uniqueDocumentParagraphIdentity, updateDocumentColumnWidth, updateDocumentCustomPageMillimeters, updateDocumentGutterPosition, updateDocumentMirrorMargins, updateDocumentPageChromeVariant, updateDocumentPageMarginMillimeters, updateDocumentPageMarginMode, updateDocumentPageOrientation, updateDocumentPaperSizePreset, validateDocumentBookmarkName, windowDocumentModel, workDocumentSchema, workOfficeDocumentCollaborationFragment as officeDocumentCollaborationFragment, work_document_page_margins_twipsToMillimeters, wrapsBesideImage };
|