Commit 766f82e
fix: align rtl toolbar state and alignment writes with ooxml bidi (#3244)
* fix: align rtl toolbar state and alignment writes with ooxml bidi
* test(rtl-alignment): cover helper roundtrip + toolbar writer + doc-api export
Adds three coverage layers for the SD-3094 writer-side mirror:
- paragraph-alignment unit (23 tests): direct coverage of the new helper
pair (mapDisplayAlignmentToStoredJustification +
mapStoredJustificationToDisplayAlignment), including the absent-value
default and a display->stored->display roundtrip for every alignment.
- Toolbar behavior (4 tests): clicking each align button on an RTL
paragraph writes the expected mirrored OOXML justification (verified
via the doc-api).
- Doc-API story (5 tests): format.paragraph.setAlignment on an RTL
paragraph exports the expected w:jc value (left->right, right->left,
center->center, justify->both); LTR baseline unchanged.
Fixture rtl-paragraph-alignment.docx is duplicated from the SD-3093
behavior tests so this PR's CI can run standalone; it will collapse to
the SD-3093 copy when the two PRs merge.
* test(rtl-alignment): cover section-bidi-only edge case (ECMA-376 §17.6.1)
Adds regression coverage for the spec rule that section-level w:bidi
must NOT cascade to paragraph w:jc interpretation. Section bidi affects
only section-level properties (page numbers, columns), not paragraph
alignment.
The fixture has a section with <w:bidi/> but two paragraphs without
paragraph-level <w:bidi/>. Tests verify that clicking Align Left or
Align Right on these paragraphs stores the display value unchanged
(no mirror), since the paragraph itself is LTR per spec.
* test(rtl-alignment): cover headings, tables, multi-paragraph selection, and indent
Expands SD-3094 behavior coverage across additional surfaces that share
the alignment-writer code path:
- Headings (Heading1/Heading2 with w:bidi): Align Left/Right mirrors
the stored OOXML the same way it does for body paragraphs.
- Table cells with RTL direction (w:bidiVisual): Align Left on a
Hebrew cell paragraph stores w:jc=right.
- Multi-paragraph selection across three RTL paragraphs: Align Left
applies the writer mirror per-paragraph, all three end up stored
as w:jc=right.
- Indent + RTL: Increase Indent on an RTL paragraph updates the
paragraph properties (smoke test against the toolbar indent button).
Lists + RTL alignment was investigated but deferred: it needs a
hand-crafted OOXML fixture with explicit numbering + paragraph-level
bidi, which is a bigger scope and better tracked separately.
---------
Co-authored-by: Artem Nistuley <artem@superdoc.dev>
Co-authored-by: Caio Pizzol <caio@superdoc.dev>1 parent fa0cfc5 commit 766f82e
20 files changed
Lines changed: 1158 additions & 30 deletions
File tree
- packages/super-editor/src
- editors/v1
- core/helpers
- document-api-adapters/plan-engine
- extensions/text-align
- headless-toolbar
- helpers
- tests
- behavior/tests
- formatting/fixtures
- toolbar
- doc-api-stories/tests/formatting
Lines changed: 33 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
Lines changed: 105 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
| 82 | + | |
| 83 | + | |
| 84 | + | |
| 85 | + | |
| 86 | + | |
| 87 | + | |
| 88 | + | |
| 89 | + | |
| 90 | + | |
| 91 | + | |
| 92 | + | |
| 93 | + | |
| 94 | + | |
| 95 | + | |
| 96 | + | |
| 97 | + | |
| 98 | + | |
| 99 | + | |
| 100 | + | |
| 101 | + | |
| 102 | + | |
| 103 | + | |
| 104 | + | |
| 105 | + | |
Lines changed: 109 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
34 | 34 | | |
35 | 35 | | |
36 | 36 | | |
| 37 | + | |
37 | 38 | | |
38 | 39 | | |
39 | 40 | | |
| |||
71 | 72 | | |
72 | 73 | | |
73 | 74 | | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
74 | 79 | | |
75 | 80 | | |
76 | 81 | | |
| |||
81 | 86 | | |
82 | 87 | | |
83 | 88 | | |
| 89 | + | |
| 90 | + | |
| 91 | + | |
84 | 92 | | |
85 | 93 | | |
86 | 94 | | |
| |||
3015 | 3023 | | |
3016 | 3024 | | |
3017 | 3025 | | |
| 3026 | + | |
| 3027 | + | |
| 3028 | + | |
| 3029 | + | |
| 3030 | + | |
| 3031 | + | |
| 3032 | + | |
| 3033 | + | |
| 3034 | + | |
| 3035 | + | |
| 3036 | + | |
| 3037 | + | |
| 3038 | + | |
| 3039 | + | |
| 3040 | + | |
| 3041 | + | |
| 3042 | + | |
| 3043 | + | |
| 3044 | + | |
| 3045 | + | |
| 3046 | + | |
| 3047 | + | |
| 3048 | + | |
| 3049 | + | |
| 3050 | + | |
| 3051 | + | |
| 3052 | + | |
| 3053 | + | |
| 3054 | + | |
| 3055 | + | |
| 3056 | + | |
| 3057 | + | |
| 3058 | + | |
| 3059 | + | |
| 3060 | + | |
| 3061 | + | |
| 3062 | + | |
| 3063 | + | |
| 3064 | + | |
| 3065 | + | |
| 3066 | + | |
| 3067 | + | |
| 3068 | + | |
| 3069 | + | |
| 3070 | + | |
| 3071 | + | |
| 3072 | + | |
| 3073 | + | |
| 3074 | + | |
| 3075 | + | |
| 3076 | + | |
| 3077 | + | |
| 3078 | + | |
| 3079 | + | |
| 3080 | + | |
| 3081 | + | |
| 3082 | + | |
| 3083 | + | |
| 3084 | + | |
| 3085 | + | |
| 3086 | + | |
| 3087 | + | |
| 3088 | + | |
| 3089 | + | |
| 3090 | + | |
| 3091 | + | |
| 3092 | + | |
| 3093 | + | |
| 3094 | + | |
| 3095 | + | |
| 3096 | + | |
| 3097 | + | |
| 3098 | + | |
| 3099 | + | |
| 3100 | + | |
| 3101 | + | |
| 3102 | + | |
| 3103 | + | |
| 3104 | + | |
| 3105 | + | |
| 3106 | + | |
| 3107 | + | |
| 3108 | + | |
| 3109 | + | |
| 3110 | + | |
| 3111 | + | |
| 3112 | + | |
| 3113 | + | |
| 3114 | + | |
| 3115 | + | |
| 3116 | + | |
| 3117 | + | |
| 3118 | + | |
| 3119 | + | |
| 3120 | + | |
| 3121 | + | |
| 3122 | + | |
| 3123 | + | |
| 3124 | + | |
| 3125 | + | |
| 3126 | + | |
3018 | 3127 | | |
3019 | 3128 | | |
3020 | 3129 | | |
| |||
Lines changed: 15 additions & 8 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
39 | 39 | | |
40 | 40 | | |
41 | 41 | | |
42 | | - | |
| 42 | + | |
43 | 43 | | |
44 | 44 | | |
45 | 45 | | |
| |||
53 | 53 | | |
54 | 54 | | |
55 | 55 | | |
| 56 | + | |
56 | 57 | | |
57 | 58 | | |
58 | 59 | | |
| |||
1067 | 1068 | | |
1068 | 1069 | | |
1069 | 1070 | | |
1070 | | - | |
1071 | | - | |
1072 | 1071 | | |
1073 | 1072 | | |
1074 | 1073 | | |
1075 | 1074 | | |
1076 | 1075 | | |
1077 | | - | |
1078 | | - | |
1079 | | - | |
| 1076 | + | |
| 1077 | + | |
| 1078 | + | |
| 1079 | + | |
| 1080 | + | |
| 1081 | + | |
| 1082 | + | |
| 1083 | + | |
1080 | 1084 | | |
1081 | 1085 | | |
1082 | 1086 | | |
| |||
1086 | 1090 | | |
1087 | 1091 | | |
1088 | 1092 | | |
| 1093 | + | |
| 1094 | + | |
| 1095 | + | |
1089 | 1096 | | |
1090 | 1097 | | |
1091 | 1098 | | |
| |||
1145 | 1152 | | |
1146 | 1153 | | |
1147 | 1154 | | |
1148 | | - | |
| 1155 | + | |
1149 | 1156 | | |
1150 | 1157 | | |
1151 | 1158 | | |
| |||
1305 | 1312 | | |
1306 | 1313 | | |
1307 | 1314 | | |
1308 | | - | |
| 1315 | + | |
1309 | 1316 | | |
1310 | 1317 | | |
1311 | 1318 | | |
| |||
0 commit comments