@a3s-lab/office 0.24.0 → 0.26.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 +3 -1
- package/dist/0~spreadsheet-editor.js +20305 -19251
- package/dist/0~work-office-diagnostics.js +2 -2
- package/dist/{5045.js → 164.js} +1135 -18
- package/dist/4104.js +46 -748
- package/dist/6282.js +221 -235
- package/dist/9424.js +16 -0
- package/dist/core.js +1 -1
- package/dist/index.js +1 -1
- package/dist/internal/features/work/editors/spreadsheet-command-controller.d.ts +18 -9
- package/dist/internal/features/work/editors/spreadsheet-operation-projection.d.ts +6 -0
- package/dist/internal/features/work/editors/spreadsheet-rich-text-dom-selection.d.ts +11 -0
- package/dist/internal/features/work/editors/spreadsheet-rich-text-paste.d.ts +22 -0
- package/dist/internal/features/work/editors/spreadsheet-rich-text-selection-controller.d.ts +38 -0
- package/dist/internal/features/work/editors/spreadsheet-rich-text-selection-format.d.ts +26 -0
- package/dist/internal/features/work/work-css-color.d.ts +1 -0
- package/dist/internal/features/work/work-document-paragraph-shading.d.ts +1 -1
- package/dist/internal/features/work/work-xlsx-cell-style-origin.d.ts +1 -0
- package/dist/internal/features/work/work-xlsx-colors.d.ts +1 -1
- package/dist/internal/features/work/work-xlsx-interop.d.ts +2 -0
- package/dist/internal/features/work/work-xlsx-rich-text-edit.d.ts +28 -0
- package/dist/internal/features/work/work-xlsx-rich-text-model.d.ts +40 -0
- package/dist/internal/features/work/work-xlsx-rich-text.d.ts +41 -0
- package/dist/internal/features/work/work-xlsx-worksheet-scan.d.ts +1 -0
- package/dist/internal/features/work/work-xlsx-worksheet.d.ts +5 -0
- package/dist/office-kernel.wasm +0 -0
- package/dist/work-spreadsheet-package-scan.worker.js +6 -2
- package/docs/latest/en/browser-editor-architecture.md +27 -0
- package/package.json +4 -1
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { Cell } from '@fortune-sheet/core';
|
|
2
|
+
import type { WorkSpreadsheetContent } from '../work-types';
|
|
3
|
+
export type SpreadsheetRichTextFormatAttribute = 'bl' | 'cl' | 'fc' | 'ff' | 'fs' | 'it' | 'un';
|
|
4
|
+
export type SpreadsheetRichTextToggleAttribute = 'bl' | 'cl' | 'it' | 'un';
|
|
5
|
+
export interface SpreadsheetTextSelection {
|
|
6
|
+
end: number;
|
|
7
|
+
start: number;
|
|
8
|
+
}
|
|
9
|
+
export interface SpreadsheetRichTextSelectionFormatRequest {
|
|
10
|
+
attribute: SpreadsheetRichTextFormatAttribute;
|
|
11
|
+
column: number;
|
|
12
|
+
row: number;
|
|
13
|
+
selection: SpreadsheetTextSelection;
|
|
14
|
+
sheetId: string;
|
|
15
|
+
/**
|
|
16
|
+
* A cell reconstructed from the live editor before focus moves into a
|
|
17
|
+
* ribbon popover. It is intentionally internal and still passes through all
|
|
18
|
+
* text, run-count, coordinate, and formatting bounds below.
|
|
19
|
+
*/
|
|
20
|
+
sourceCell?: Cell;
|
|
21
|
+
value: unknown;
|
|
22
|
+
}
|
|
23
|
+
export declare function canApplySpreadsheetRichTextSelectionFormat(content: WorkSpreadsheetContent, request: SpreadsheetRichTextSelectionFormatRequest): boolean;
|
|
24
|
+
export declare function applySpreadsheetRichTextSelectionFormat(content: WorkSpreadsheetContent, request: SpreadsheetRichTextSelectionFormatRequest): WorkSpreadsheetContent | null;
|
|
25
|
+
export declare function formatSpreadsheetRichTextSelection(cell: Cell, selection: SpreadsheetTextSelection, attribute: SpreadsheetRichTextFormatAttribute, value: unknown): Cell | null;
|
|
26
|
+
export declare function spreadsheetRichTextSelectionToggleValue(cell: Cell, selection: SpreadsheetTextSelection, attribute: SpreadsheetRichTextToggleAttribute): 0 | 1 | null;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function normalizeCssColor(source: string | null | undefined): 'transparent' | `#${string}` | null;
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { type DocxThemeColorReference } from './work-docx-theme-reference';
|
|
2
|
+
export { normalizeCssColor } from './work-css-color';
|
|
2
3
|
export type DocumentParagraphShadingPattern = 'nil' | 'clear' | 'solid' | 'horzStripe' | 'vertStripe' | 'reverseDiagStripe' | 'diagStripe' | 'horzCross' | 'diagCross' | 'thinHorzStripe' | 'thinVertStripe' | 'thinReverseDiagStripe' | 'thinDiagStripe' | 'thinHorzCross' | 'thinDiagCross' | 'pct5' | 'pct10' | 'pct12' | 'pct15' | 'pct20' | 'pct25' | 'pct30' | 'pct35' | 'pct37' | 'pct40' | 'pct45' | 'pct50' | 'pct55' | 'pct60' | 'pct62' | 'pct65' | 'pct70' | 'pct75' | 'pct80' | 'pct85' | 'pct87' | 'pct90' | 'pct95';
|
|
3
4
|
export interface DocumentParagraphShadingColor {
|
|
4
5
|
value: 'auto' | `#${string}`;
|
|
@@ -15,4 +16,3 @@ export declare function parseDocumentParagraphShading(source: unknown): Document
|
|
|
15
16
|
export declare function serializeDocumentParagraphShading(source: unknown): string | undefined;
|
|
16
17
|
export declare function parseDocumentParagraphShadingElement(element: HTMLElement): DocumentParagraphShading | null;
|
|
17
18
|
export declare function documentParagraphShadingDomAttributes(source: unknown): Record<string, string>;
|
|
18
|
-
export declare function normalizeCssColor(source: string | null | undefined): 'transparent' | `#${string}` | null;
|
|
@@ -42,3 +42,4 @@ export declare function applyXlsxSemanticColorOrigin(element: Element, origin: X
|
|
|
42
42
|
export declare function xlsxSemanticColorOriginKey(origin: XlsxSemanticColorOrigin | undefined): string;
|
|
43
43
|
export declare function xlsxSemanticColorOriginSupported(origin: XlsxSemanticColorOrigin, palette: XlsxSemanticPalette | undefined): boolean;
|
|
44
44
|
export declare function prepareXlsxSemanticPalette(styles: Document, theme: Document | null, origins: Iterable<XlsxCellStyleOrigin>): PreparedXlsxSemanticPalette;
|
|
45
|
+
export declare function normalizeXlsxSemanticColorOrigin(value: unknown): XlsxSemanticColorOrigin | undefined;
|
|
@@ -2,5 +2,5 @@ export interface XlsxColorResolver {
|
|
|
2
2
|
indexed: readonly string[];
|
|
3
3
|
theme: readonly string[];
|
|
4
4
|
}
|
|
5
|
-
export declare function createXlsxColorResolver(styles: Document, theme: Document | null): XlsxColorResolver;
|
|
5
|
+
export declare function createXlsxColorResolver(styles: Document | null, theme: Document | null): XlsxColorResolver;
|
|
6
6
|
export declare function resolveXlsxColor(element: Element | undefined, resolver: XlsxColorResolver): string | undefined;
|
|
@@ -9,6 +9,7 @@ import { type XlsxManualPageBreaks } from './work-xlsx-page-breaks';
|
|
|
9
9
|
import { type XlsxPageSetup } from './work-xlsx-page-setup';
|
|
10
10
|
import { type XlsxProtectionFeatures } from './work-xlsx-protection';
|
|
11
11
|
import { type XlsxWorksheetXmlScan } from './work-xlsx-worksheet-scan';
|
|
12
|
+
import { type XlsxRichTextCell } from './work-xlsx-rich-text';
|
|
12
13
|
import type { WorkSpreadsheetTable } from './work-types';
|
|
13
14
|
type FrozenPane = NonNullable<Sheet['frozen']>;
|
|
14
15
|
export interface XlsxDataValidation {
|
|
@@ -26,6 +27,7 @@ export interface XlsxSheetFeatures {
|
|
|
26
27
|
images: XlsxWorksheetImage[];
|
|
27
28
|
charts: XlsxWorksheetChart[];
|
|
28
29
|
tables: WorkSpreadsheetTable[];
|
|
30
|
+
richTextCells: XlsxRichTextCell[];
|
|
29
31
|
}
|
|
30
32
|
export type FortuneDataValidationItem = WorkSpreadsheetDataValidationItem;
|
|
31
33
|
export declare function readXlsxSheetFeatures(buffer: ArrayBuffer): Promise<Map<string, XlsxSheetFeatures>>;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { Cell } from '@fortune-sheet/core';
|
|
2
|
+
import { type XlsxRichTextRun } from './work-xlsx-rich-text-model';
|
|
3
|
+
export interface SpreadsheetRichTextPasteIntent {
|
|
4
|
+
end: number;
|
|
5
|
+
runs: readonly XlsxRichTextRun[];
|
|
6
|
+
start: number;
|
|
7
|
+
text: string;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Reconciles a text edit emitted by Fortune with the previous native XLSX
|
|
11
|
+
* rich-text cell. Formula-bar edits may arrive as a plain string, while the
|
|
12
|
+
* in-cell editor emits visible runs without A3S-only semantic color metadata.
|
|
13
|
+
* This bounded model restores only style and metadata justified by the prior
|
|
14
|
+
* controlled value and the exact text replacement.
|
|
15
|
+
*/
|
|
16
|
+
export declare function reconcileSpreadsheetRichTextCellEdit(previous: Cell | null | undefined, current: Cell, formattedPaste?: SpreadsheetRichTextPasteIntent): Cell;
|
|
17
|
+
/**
|
|
18
|
+
* Restores the controlled runs when an unauthenticated Fortune callback keeps
|
|
19
|
+
* the exact visible text but drops native run metadata. Callers must reserve
|
|
20
|
+
* this for non-structural batches without an exact cell-operation coordinate.
|
|
21
|
+
*/
|
|
22
|
+
export declare function restoreSpreadsheetRichTextCellRuns(previous: Cell | null | undefined, current: Cell): Cell;
|
|
23
|
+
/**
|
|
24
|
+
* Proves that Fortune retained the visible text of a controlled native
|
|
25
|
+
* rich-text cell. This permits metadata-only callbacks to restore lost run
|
|
26
|
+
* structure without guessing across a text or structural edit.
|
|
27
|
+
*/
|
|
28
|
+
export declare function sameSpreadsheetRichTextCellText(previous: Cell | null | undefined, current: Cell): boolean;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { Cell } from '@fortune-sheet/core';
|
|
2
|
+
import { type XlsxSemanticColorOrigin } from './work-xlsx-cell-style-origin';
|
|
3
|
+
import type { SpreadsheetUnderlineCellValue } from './work-spreadsheet-underline';
|
|
4
|
+
export declare const MAX_XLSX_RICH_TEXT_CELL_CHARACTERS = 32767;
|
|
5
|
+
export declare const MAX_XLSX_RICH_TEXT_RUNS_PER_CELL = 512;
|
|
6
|
+
export declare const MAX_XLSX_RICH_TEXT_CELLS = 10000;
|
|
7
|
+
export declare const MAX_XLSX_RICH_TEXT_RUNS = 100000;
|
|
8
|
+
export declare const MAX_XLSX_RICH_TEXT_FONT_NAME_CHARACTERS = 128;
|
|
9
|
+
export declare const MAX_XLSX_RICH_TEXT_FONT_SIZE = 409;
|
|
10
|
+
export interface XlsxRichTextRun {
|
|
11
|
+
a3sXlsxColorOrigin?: XlsxSemanticColorOrigin;
|
|
12
|
+
bl?: 0 | 1;
|
|
13
|
+
cl?: 0 | 1;
|
|
14
|
+
fc?: string;
|
|
15
|
+
ff?: string;
|
|
16
|
+
fs?: number;
|
|
17
|
+
it?: 0 | 1;
|
|
18
|
+
un?: SpreadsheetUnderlineCellValue;
|
|
19
|
+
v: string;
|
|
20
|
+
}
|
|
21
|
+
export interface NormalizedXlsxRichTextCell {
|
|
22
|
+
runs: XlsxRichTextRun[];
|
|
23
|
+
text: string;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Normalizes the text state that may participate in caret-level rich-text
|
|
27
|
+
* authoring. Native runs remain authoritative; bounded plain strings receive
|
|
28
|
+
* one run derived from the cell-wide font so partial formatting and formatted
|
|
29
|
+
* paste share the same conversion contract.
|
|
30
|
+
*/
|
|
31
|
+
export declare function normalizeXlsxRichTextEditSource(cell: Cell | null | undefined): NormalizedXlsxRichTextCell | null;
|
|
32
|
+
export declare function xlsxRichTextBaseRun(cell: Cell | null | undefined, text: string): XlsxRichTextRun;
|
|
33
|
+
export declare function normalizeXlsxRichTextCell(cell: Cell): NormalizedXlsxRichTextCell | null;
|
|
34
|
+
export declare function normalizeXlsxRichTextRun(value: unknown): XlsxRichTextRun | null;
|
|
35
|
+
export declare function normalizeXlsxRichTextColor(value: unknown): string | null;
|
|
36
|
+
export declare function coalesceXlsxRichTextRuns(source: readonly XlsxRichTextRun[]): XlsxRichTextRun[];
|
|
37
|
+
export declare function sameXlsxRichTextRunStyle(left: XlsxRichTextRun, right: XlsxRichTextRun): boolean;
|
|
38
|
+
export declare function validXlsxRichText(value: string): boolean;
|
|
39
|
+
export declare function isHighSurrogate(value: number): boolean;
|
|
40
|
+
export declare function isLowSurrogate(value: number): boolean;
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { Cell, Sheet } from '@fortune-sheet/core';
|
|
2
|
+
import { type SpreadsheetUnderlineStyle } from './work-spreadsheet-underline';
|
|
3
|
+
import { type XlsxCellStyleOrigin, type XlsxSemanticPalette } from './work-xlsx-cell-style-origin';
|
|
4
|
+
import { type XlsxColorResolver } from './work-xlsx-colors';
|
|
5
|
+
import { type XlsxRichTextRun } from './work-xlsx-rich-text-model';
|
|
6
|
+
export { MAX_XLSX_RICH_TEXT_CELL_CHARACTERS, MAX_XLSX_RICH_TEXT_CELLS, MAX_XLSX_RICH_TEXT_RUNS, MAX_XLSX_RICH_TEXT_RUNS_PER_CELL, type XlsxRichTextRun, } from './work-xlsx-rich-text-model';
|
|
7
|
+
export interface XlsxRichTextCell {
|
|
8
|
+
column: number;
|
|
9
|
+
row: number;
|
|
10
|
+
runs: XlsxRichTextRun[];
|
|
11
|
+
text: string;
|
|
12
|
+
}
|
|
13
|
+
export interface XlsxRichTextReadContext {
|
|
14
|
+
readonly colors: XlsxColorResolver;
|
|
15
|
+
readonly hasRichSharedStrings: boolean;
|
|
16
|
+
readonly sharedStrings: ReadonlyMap<number, readonly XlsxRichTextRun[]>;
|
|
17
|
+
remainingCells: number;
|
|
18
|
+
remainingRuns: number;
|
|
19
|
+
}
|
|
20
|
+
interface XlsxRichTextContextOptions {
|
|
21
|
+
sharedStrings: Document | null;
|
|
22
|
+
styles: Document | null;
|
|
23
|
+
theme: Document | null;
|
|
24
|
+
}
|
|
25
|
+
interface SpreadsheetRichTextFontPatch {
|
|
26
|
+
bold?: boolean;
|
|
27
|
+
fontColor?: string;
|
|
28
|
+
fontFamily?: string;
|
|
29
|
+
fontSize?: number;
|
|
30
|
+
italic?: boolean;
|
|
31
|
+
strike?: boolean;
|
|
32
|
+
underline?: SpreadsheetUnderlineStyle;
|
|
33
|
+
}
|
|
34
|
+
export declare function createXlsxRichTextReadContext(options: XlsxRichTextContextOptions): XlsxRichTextReadContext;
|
|
35
|
+
export declare function readXlsxRichTextCells(worksheet: Document, context: XlsxRichTextReadContext): XlsxRichTextCell[];
|
|
36
|
+
export declare function applyImportedXlsxRichText(cell: Cell, richText: XlsxRichTextCell | undefined): Cell;
|
|
37
|
+
export declare function patchSpreadsheetRichTextFontRuns(cell: Cell, patch: SpreadsheetRichTextFontPatch): Cell;
|
|
38
|
+
export declare function xlsxRichTextCellText(cell: Cell): string | null;
|
|
39
|
+
export declare function sheetHasXlsxRichTextCells(sheet: Sheet): boolean;
|
|
40
|
+
export declare function xlsxRichTextStyleOrigins(sheet: Sheet): XlsxCellStyleOrigin[];
|
|
41
|
+
export declare function writeXlsxRichTextCells(worksheet: Document, sheet: Sheet, semanticPalette?: XlsxSemanticPalette): void;
|
|
@@ -10,3 +10,8 @@ export interface XlsxWorksheetCellEntry {
|
|
|
10
10
|
* materializing a second list of every worksheet cell.
|
|
11
11
|
*/
|
|
12
12
|
export declare function xlsxWorksheetCellEntries(worksheet: WorkSheet): Generator<XlsxWorksheetCellEntry>;
|
|
13
|
+
export declare function xlsxCellAddress(row: number, column: number): string;
|
|
14
|
+
export declare function decodeXlsxCellAddress(address: string): {
|
|
15
|
+
column: number;
|
|
16
|
+
row: number;
|
|
17
|
+
} | null;
|
package/dist/office-kernel.wasm
CHANGED
|
Binary file
|
|
@@ -4012,22 +4012,24 @@ https://github.com/nodeca/pako/blob/main/LICENSE
|
|
|
4012
4012
|
'rowBreaks',
|
|
4013
4013
|
'colBreaks'
|
|
4014
4014
|
]);
|
|
4015
|
-
const WORKSHEET_SCAN_PATTERN = /<(?:[A-Za-z_][\w.-]*:)?(?:(cols|f|pane|dataValidation|conditionalFormatting|sheetProtection|protectedRange|rowBreaks|colBreaks|pageSetup|pageMargins|printOptions|headerFooter|pageSetUpPr|drawing|tableParts)(?=[\s/>])|(row)(?=[\s/>])[^>]*\s(?:collapsed|customFormat|customHeight|hidden|ht|outlineLevel|thickBot|thickTop)\s*=|(c)(?=[\s/>])[^>]*\ss\s
|
|
4015
|
+
const WORKSHEET_SCAN_PATTERN = /<(?:[A-Za-z_][\w.-]*:)?(?:(cols|f|pane|dataValidation|conditionalFormatting|sheetProtection|protectedRange|rowBreaks|colBreaks|pageSetup|pageMargins|printOptions|headerFooter|pageSetUpPr|drawing|tableParts)(?=[\s/>])|(row)(?=[\s/>])[^>]*\s(?:collapsed|customFormat|customHeight|hidden|ht|outlineLevel|thickBot|thickTop)\s*=|(c)(?=[\s/>])[^>]*\ss\s*=|(r)(?=[\s/>]))/g;
|
|
4016
4016
|
function scanXlsxWorksheetXml(source) {
|
|
4017
4017
|
let hasDirectCellStyles = false;
|
|
4018
4018
|
let hasDiagnosticFeatures = false;
|
|
4019
4019
|
let hasFormulaFeatures = false;
|
|
4020
4020
|
let hasImportedFeatures = false;
|
|
4021
|
+
let hasRichTextCells = false;
|
|
4021
4022
|
let requiresSheetJsCellStyles = false;
|
|
4022
4023
|
WORKSHEET_SCAN_PATTERN.lastIndex = 0;
|
|
4023
4024
|
for(let match = WORKSHEET_SCAN_PATTERN.exec(source); match;){
|
|
4024
4025
|
const element = match[1];
|
|
4025
4026
|
if (match[3]) hasDirectCellStyles = true;
|
|
4027
|
+
if (match[4]) hasRichTextCells = true;
|
|
4026
4028
|
if (match[2] || match[3] || 'cols' === element) requiresSheetJsCellStyles = true;
|
|
4027
4029
|
if ('f' === element) hasFormulaFeatures = true;
|
|
4028
4030
|
if (element && IMPORTED_WORKSHEET_ELEMENTS.has(element)) hasImportedFeatures = true;
|
|
4029
4031
|
if (element && DIAGNOSTIC_WORKSHEET_ELEMENTS.has(element)) hasDiagnosticFeatures = true;
|
|
4030
|
-
if (hasDirectCellStyles && hasDiagnosticFeatures && hasFormulaFeatures && hasImportedFeatures && requiresSheetJsCellStyles) break;
|
|
4032
|
+
if (hasDirectCellStyles && hasDiagnosticFeatures && hasFormulaFeatures && hasImportedFeatures && hasRichTextCells && requiresSheetJsCellStyles) break;
|
|
4031
4033
|
match = WORKSHEET_SCAN_PATTERN.exec(source);
|
|
4032
4034
|
}
|
|
4033
4035
|
WORKSHEET_SCAN_PATTERN.lastIndex = 0;
|
|
@@ -4036,6 +4038,7 @@ https://github.com/nodeca/pako/blob/main/LICENSE
|
|
|
4036
4038
|
hasDiagnosticFeatures,
|
|
4037
4039
|
hasFormulaFeatures,
|
|
4038
4040
|
hasImportedFeatures,
|
|
4041
|
+
hasRichTextCells,
|
|
4039
4042
|
requiresSheetJsCellStyles
|
|
4040
4043
|
};
|
|
4041
4044
|
}
|
|
@@ -4131,6 +4134,7 @@ https://github.com/nodeca/pako/blob/main/LICENSE
|
|
|
4131
4134
|
hasDiagnosticFeatures: false,
|
|
4132
4135
|
hasFormulaFeatures: false,
|
|
4133
4136
|
hasImportedFeatures: false,
|
|
4137
|
+
hasRichTextCells: false,
|
|
4134
4138
|
requiresSheetJsCellStyles: false
|
|
4135
4139
|
};
|
|
4136
4140
|
async function plainWorkbookPlan(zip, packagePaths) {
|
|
@@ -319,6 +319,33 @@ materialization. Fortune row/column operations are reconciled back into table
|
|
|
319
319
|
ranges, column identities, filter offsets, and canonical header cells, while
|
|
320
320
|
merge and worksheet AutoFilter commands reject intersecting ownership.
|
|
321
321
|
|
|
322
|
+
Native XLSX rich-text editing is reconciled at the controlled Fortune boundary,
|
|
323
|
+
not inside the rendering engine. A pure model normalizes at most 512 runs and
|
|
324
|
+
32,767 UTF-16 code units, derives one contiguous replacement, uses binary run
|
|
325
|
+
lookup for inherited styles, and coalesces only semantically identical adjacent
|
|
326
|
+
runs. Authenticated `data[row][column]` operations permit text changes at exact
|
|
327
|
+
coordinates. In the full-projection compatibility path, a non-structural batch
|
|
328
|
+
without a cell coordinate may restore prior runs only when the visible text is
|
|
329
|
+
exactly unchanged; structural operations disable coordinate inference. This
|
|
330
|
+
keeps formula-bar and F2 commits to one host revision and one Undo record while
|
|
331
|
+
discarding Fortune focus callbacks that merely flatten or strip run metadata.
|
|
332
|
+
|
|
333
|
+
Formatted paste adds a separate one-shot authority instead of trusting live
|
|
334
|
+
DOM markup. A paste event in the formula bar or F2 editor records the exact
|
|
335
|
+
sheet object, coordinate, controlled source text, UTF-16 selection, sanitized
|
|
336
|
+
clipboard runs, and plain text before the browser mutates the editor. The
|
|
337
|
+
incremental and full projection paths may consume that authority only when an
|
|
338
|
+
authenticated cell operation emits the exact predicted replacement. Prefix
|
|
339
|
+
and suffix runs always come from the controlled source; only the inserted
|
|
340
|
+
range may use clipboard font family, point size, RGB color, bold, italic,
|
|
341
|
+
strikethrough, or underline. This also converts eligible plain or empty cells
|
|
342
|
+
to native inline strings without granting structural callbacks a coordinate.
|
|
343
|
+
The parser never retains clipboard HTML, ignores active/non-content elements,
|
|
344
|
+
and rejects mismatched text, invalid UTF-16, more than 256,000 HTML characters,
|
|
345
|
+
32,767 cell characters, or 512 resulting runs. Imported semantic color
|
|
346
|
+
identities remain attached to untouched runs; pasted colors are explicit RGB
|
|
347
|
+
unless a future package-level source can prove a native palette identity.
|
|
348
|
+
|
|
322
349
|
The table is a fidelity statement, not a marketing capability list. The
|
|
323
350
|
current Document path shapes text-flow paragraphs in Rust/WASM when every
|
|
324
351
|
explicit CSS family resolves to an exact registered face. Each run may carry up
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@a3s-lab/office",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.26.0",
|
|
4
4
|
"description": "Open-source collaborative browser editors for documents, Markdown, spreadsheets, presentations, and PDFs.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"office",
|
|
@@ -95,6 +95,7 @@
|
|
|
95
95
|
"playground:visual:spreadsheet-font-colors-shortcuts": "playwright test visual-tests/spreadsheet-font-colors-shortcuts.functional.spec.ts --config playwright.config.ts",
|
|
96
96
|
"playground:visual:spreadsheet-hyperlink": "playwright test visual-tests/spreadsheet-hyperlink.functional.spec.ts --config playwright.config.ts",
|
|
97
97
|
"playground:visual:spreadsheet-ribbon": "playwright test visual-tests/spreadsheet-ribbon.functional.spec.ts --config playwright.config.ts",
|
|
98
|
+
"playground:visual:spreadsheet-rich-text": "playwright test visual-tests/spreadsheet-rich-text.functional.spec.ts --config playwright.config.ts",
|
|
98
99
|
"playground:visual:spreadsheet-underline": "playwright test visual-tests/spreadsheet-underline.functional.spec.ts --config playwright.config.ts",
|
|
99
100
|
"playground:visual:spreadsheet-table": "playwright test visual-tests/spreadsheet-table.functional.spec.ts --config playwright.config.ts",
|
|
100
101
|
"playground:visual:update": "playwright test --config playwright.config.ts --update-snapshots",
|
|
@@ -169,6 +170,8 @@
|
|
|
169
170
|
"test:e2e:spreadsheet-copy-from-above:check": "a3s-test check tests/e2e/spreadsheet-copy-from-above.acl --json",
|
|
170
171
|
"test:e2e:spreadsheet-font-dialog-shortcuts": "A3S_TEST_SUITE=tests/e2e/spreadsheet-font-dialog-shortcuts.acl bash scripts/run-a3s-test-web-gate.sh",
|
|
171
172
|
"test:e2e:spreadsheet-font-dialog-shortcuts:check": "a3s-test check tests/e2e/spreadsheet-font-dialog-shortcuts.acl --json",
|
|
173
|
+
"test:e2e:spreadsheet-rich-text": "A3S_TEST_SUITE=tests/e2e/spreadsheet-rich-text.acl bash scripts/run-a3s-test-web-gate.sh",
|
|
174
|
+
"test:e2e:spreadsheet-rich-text:check": "a3s-test check tests/e2e/spreadsheet-rich-text.acl --json",
|
|
172
175
|
"test:e2e:spreadsheet-hyperlink": "a3s-test run tests/e2e/spreadsheet-hyperlink.acl --json",
|
|
173
176
|
"test:e2e:spreadsheet-hyperlink:check": "a3s-test check tests/e2e/spreadsheet-hyperlink.acl --json",
|
|
174
177
|
"test:e2e:spreadsheet-maximum-sparse": "a3s-test run tests/e2e/spreadsheet-maximum-sparse.acl --json",
|