dimcode-darwin-x64 0.1.2-beta.1 → 0.1.2

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.
Files changed (148) hide show
  1. package/bin/dimcode +0 -0
  2. package/package.json +1 -1
  3. package/bin/runtime/sandbox/dim-sandbox-runner +0 -0
  4. package/bin/runtime/sandbox/manifest.json +0 -15
  5. package/bin/skills-assets/deep-investigate/SKILL.md +0 -101
  6. package/bin/skills-assets/deep-investigate/references/prompts.md +0 -75
  7. package/bin/skills-assets/deep-investigate/references/templates.md +0 -73
  8. package/bin/skills-assets/deep-investigate/references/thinking-tools.md +0 -36
  9. package/bin/skills-assets/docs-sprint/SKILL.md +0 -73
  10. package/bin/skills-assets/docs-sprint/agents/openai.yaml +0 -4
  11. package/bin/skills-assets/docs-sprint/references/contract-discipline.md +0 -30
  12. package/bin/skills-assets/docs-sprint/references/delivery-plan.md +0 -162
  13. package/bin/skills-assets/docs-sprint/references/documentation-system.md +0 -109
  14. package/bin/skills-assets/docs-sprint/references/ui-layout.md +0 -73
  15. package/bin/skills-assets/docs-sprint/references/worktree-guide.md +0 -45
  16. package/bin/skills-assets/docx/SKILL.md +0 -273
  17. package/bin/skills-assets/docx/assets/styles/academic_styles.xml +0 -250
  18. package/bin/skills-assets/docx/assets/styles/corporate_styles.xml +0 -284
  19. package/bin/skills-assets/docx/assets/styles/default_styles.xml +0 -449
  20. package/bin/skills-assets/docx/assets/xsd/aesthetic-rules.xsd +0 -470
  21. package/bin/skills-assets/docx/assets/xsd/business-rules.xsd +0 -130
  22. package/bin/skills-assets/docx/assets/xsd/common-types.xsd +0 -159
  23. package/bin/skills-assets/docx/assets/xsd/wml-subset.xsd +0 -589
  24. package/bin/skills-assets/docx/references/cjk_typography.md +0 -357
  25. package/bin/skills-assets/docx/references/cjk_university_template_guide.md +0 -184
  26. package/bin/skills-assets/docx/references/comments_guide.md +0 -191
  27. package/bin/skills-assets/docx/references/design_good_bad_examples.md +0 -829
  28. package/bin/skills-assets/docx/references/design_principles.md +0 -819
  29. package/bin/skills-assets/docx/references/openxml_element_order.md +0 -308
  30. package/bin/skills-assets/docx/references/openxml_encyclopedia_part1.md +0 -4061
  31. package/bin/skills-assets/docx/references/openxml_encyclopedia_part2.md +0 -2820
  32. package/bin/skills-assets/docx/references/openxml_encyclopedia_part3.md +0 -3381
  33. package/bin/skills-assets/docx/references/openxml_namespaces.md +0 -82
  34. package/bin/skills-assets/docx/references/openxml_units.md +0 -72
  35. package/bin/skills-assets/docx/references/scenario_a_create.md +0 -284
  36. package/bin/skills-assets/docx/references/scenario_b_edit_content.md +0 -295
  37. package/bin/skills-assets/docx/references/scenario_c_apply_template.md +0 -456
  38. package/bin/skills-assets/docx/references/track_changes_guide.md +0 -200
  39. package/bin/skills-assets/docx/references/troubleshooting.md +0 -506
  40. package/bin/skills-assets/docx/references/typography_guide.md +0 -294
  41. package/bin/skills-assets/docx/references/xsd_validation_guide.md +0 -158
  42. package/bin/skills-assets/docx/scripts/doc_to_docx.sh +0 -40
  43. package/bin/skills-assets/docx/scripts/docx_preview.sh +0 -37
  44. package/bin/skills-assets/docx/scripts/dotnet/Docx.Cli/Docx.Cli.csproj +0 -19
  45. package/bin/skills-assets/docx/scripts/dotnet/Docx.Cli/Program.cs +0 -18
  46. package/bin/skills-assets/docx/scripts/dotnet/Docx.Core/Commands/AnalyzeCommand.cs +0 -147
  47. package/bin/skills-assets/docx/scripts/dotnet/Docx.Core/Commands/ApplyTemplateCommand.cs +0 -322
  48. package/bin/skills-assets/docx/scripts/dotnet/Docx.Core/Commands/CreateCommand.cs +0 -324
  49. package/bin/skills-assets/docx/scripts/dotnet/Docx.Core/Commands/DiffCommand.cs +0 -155
  50. package/bin/skills-assets/docx/scripts/dotnet/Docx.Core/Commands/EditContentCommand.cs +0 -487
  51. package/bin/skills-assets/docx/scripts/dotnet/Docx.Core/Commands/FixOrderCommand.cs +0 -108
  52. package/bin/skills-assets/docx/scripts/dotnet/Docx.Core/Commands/MergeRunsCommand.cs +0 -122
  53. package/bin/skills-assets/docx/scripts/dotnet/Docx.Core/Commands/ValidateCommand.cs +0 -107
  54. package/bin/skills-assets/docx/scripts/dotnet/Docx.Core/Docx.Core.csproj +0 -15
  55. package/bin/skills-assets/docx/scripts/dotnet/Docx.Core/OpenXml/CommentSynchronizer.cs +0 -169
  56. package/bin/skills-assets/docx/scripts/dotnet/Docx.Core/OpenXml/ElementOrder.cs +0 -80
  57. package/bin/skills-assets/docx/scripts/dotnet/Docx.Core/OpenXml/NamespaceConstants.cs +0 -42
  58. package/bin/skills-assets/docx/scripts/dotnet/Docx.Core/OpenXml/RunMerger.cs +0 -81
  59. package/bin/skills-assets/docx/scripts/dotnet/Docx.Core/OpenXml/StyleAnalyzer.cs +0 -81
  60. package/bin/skills-assets/docx/scripts/dotnet/Docx.Core/OpenXml/TrackChangesHelper.cs +0 -99
  61. package/bin/skills-assets/docx/scripts/dotnet/Docx.Core/OpenXml/UnitConverter.cs +0 -23
  62. package/bin/skills-assets/docx/scripts/dotnet/Docx.Core/Samples/AestheticRecipeSamples.cs +0 -1832
  63. package/bin/skills-assets/docx/scripts/dotnet/Docx.Core/Samples/AestheticRecipeSamples_Batch1.cs +0 -910
  64. package/bin/skills-assets/docx/scripts/dotnet/Docx.Core/Samples/AestheticRecipeSamples_Batch2.cs +0 -999
  65. package/bin/skills-assets/docx/scripts/dotnet/Docx.Core/Samples/AestheticRecipeSamples_Batch3.cs +0 -1048
  66. package/bin/skills-assets/docx/scripts/dotnet/Docx.Core/Samples/AestheticRecipeSamples_Batch4.cs +0 -1038
  67. package/bin/skills-assets/docx/scripts/dotnet/Docx.Core/Samples/CharacterFormattingSamples.cs +0 -1020
  68. package/bin/skills-assets/docx/scripts/dotnet/Docx.Core/Samples/DocumentCreationSamples.cs +0 -1121
  69. package/bin/skills-assets/docx/scripts/dotnet/Docx.Core/Samples/FieldAndTocSamples.cs +0 -624
  70. package/bin/skills-assets/docx/scripts/dotnet/Docx.Core/Samples/FootnoteAndCommentSamples.cs +0 -675
  71. package/bin/skills-assets/docx/scripts/dotnet/Docx.Core/Samples/HeaderFooterSamples.cs +0 -838
  72. package/bin/skills-assets/docx/scripts/dotnet/Docx.Core/Samples/ImageSamples.cs +0 -917
  73. package/bin/skills-assets/docx/scripts/dotnet/Docx.Core/Samples/ListAndNumberingSamples.cs +0 -826
  74. package/bin/skills-assets/docx/scripts/dotnet/Docx.Core/Samples/ParagraphFormattingSamples.cs +0 -1199
  75. package/bin/skills-assets/docx/scripts/dotnet/Docx.Core/Samples/StyleSystemSamples.cs +0 -1487
  76. package/bin/skills-assets/docx/scripts/dotnet/Docx.Core/Samples/TableSamples.cs +0 -1163
  77. package/bin/skills-assets/docx/scripts/dotnet/Docx.Core/Samples/TrackChangesSamples.cs +0 -595
  78. package/bin/skills-assets/docx/scripts/dotnet/Docx.Core/Typography/CjkHelper.cs +0 -39
  79. package/bin/skills-assets/docx/scripts/dotnet/Docx.Core/Typography/FontDefaults.cs +0 -24
  80. package/bin/skills-assets/docx/scripts/dotnet/Docx.Core/Typography/PageSizes.cs +0 -20
  81. package/bin/skills-assets/docx/scripts/dotnet/Docx.Core/Validation/BusinessRuleValidator.cs +0 -224
  82. package/bin/skills-assets/docx/scripts/dotnet/Docx.Core/Validation/GateCheckValidator.cs +0 -148
  83. package/bin/skills-assets/docx/scripts/dotnet/Docx.Core/Validation/ValidationResult.cs +0 -23
  84. package/bin/skills-assets/docx/scripts/dotnet/Docx.Core/Validation/XsdValidator.cs +0 -69
  85. package/bin/skills-assets/docx/scripts/dotnet/Docx.slnx +0 -4
  86. package/bin/skills-assets/docx/scripts/env_check.sh +0 -196
  87. package/bin/skills-assets/docx/scripts/setup.ps1 +0 -274
  88. package/bin/skills-assets/docx/scripts/setup.sh +0 -504
  89. package/bin/skills-assets/pdf/README.md +0 -222
  90. package/bin/skills-assets/pdf/SKILL.md +0 -191
  91. package/bin/skills-assets/pdf/design/design.md +0 -381
  92. package/bin/skills-assets/pdf/scripts/cover.py +0 -1579
  93. package/bin/skills-assets/pdf/scripts/fill_inspect.py +0 -200
  94. package/bin/skills-assets/pdf/scripts/fill_write.py +0 -242
  95. package/bin/skills-assets/pdf/scripts/make.sh +0 -491
  96. package/bin/skills-assets/pdf/scripts/merge.py +0 -112
  97. package/bin/skills-assets/pdf/scripts/palette.py +0 -521
  98. package/bin/skills-assets/pdf/scripts/reformat_parse.py +0 -374
  99. package/bin/skills-assets/pdf/scripts/render_body.py +0 -1052
  100. package/bin/skills-assets/pdf/scripts/render_cover.js +0 -111
  101. package/bin/skills-assets/pptx-generator/SKILL.md +0 -248
  102. package/bin/skills-assets/pptx-generator/references/design-system.md +0 -392
  103. package/bin/skills-assets/pptx-generator/references/editing.md +0 -162
  104. package/bin/skills-assets/pptx-generator/references/pitfalls.md +0 -112
  105. package/bin/skills-assets/pptx-generator/references/pptxgenjs.md +0 -420
  106. package/bin/skills-assets/pptx-generator/references/slide-types.md +0 -413
  107. package/bin/skills-assets/skill-creator/SKILL.md +0 -368
  108. package/bin/skills-assets/skill-creator/agents/openai.yaml +0 -5
  109. package/bin/skills-assets/skill-creator/assets/skill-creator-small.svg +0 -3
  110. package/bin/skills-assets/skill-creator/assets/skill-creator.png +0 -0
  111. package/bin/skills-assets/skill-creator/license.txt +0 -202
  112. package/bin/skills-assets/skill-creator/references/openai_yaml.md +0 -49
  113. package/bin/skills-assets/skill-creator/scripts/generate_openai_yaml.py +0 -226
  114. package/bin/skills-assets/skill-creator/scripts/init_skill.py +0 -397
  115. package/bin/skills-assets/skill-creator/scripts/quick_validate.py +0 -101
  116. package/bin/skills-assets/skill-installer/LICENSE.txt +0 -202
  117. package/bin/skills-assets/skill-installer/SKILL.md +0 -58
  118. package/bin/skills-assets/skill-installer/agents/openai.yaml +0 -5
  119. package/bin/skills-assets/skill-installer/assets/skill-installer-small.svg +0 -3
  120. package/bin/skills-assets/skill-installer/assets/skill-installer.png +0 -0
  121. package/bin/skills-assets/skill-installer/scripts/github_utils.py +0 -21
  122. package/bin/skills-assets/skill-installer/scripts/install-skill-from-github.py +0 -308
  123. package/bin/skills-assets/skill-installer/scripts/list-skills.py +0 -107
  124. package/bin/skills-assets/xlsx/SKILL.md +0 -137
  125. package/bin/skills-assets/xlsx/references/create.md +0 -691
  126. package/bin/skills-assets/xlsx/references/edit.md +0 -684
  127. package/bin/skills-assets/xlsx/references/fix.md +0 -37
  128. package/bin/skills-assets/xlsx/references/format.md +0 -768
  129. package/bin/skills-assets/xlsx/references/ooxml-cheatsheet.md +0 -231
  130. package/bin/skills-assets/xlsx/references/read-analyze.md +0 -97
  131. package/bin/skills-assets/xlsx/references/validate.md +0 -772
  132. package/bin/skills-assets/xlsx/scripts/formula_check.py +0 -422
  133. package/bin/skills-assets/xlsx/scripts/libreoffice_recalc.py +0 -248
  134. package/bin/skills-assets/xlsx/scripts/shared_strings_builder.py +0 -163
  135. package/bin/skills-assets/xlsx/scripts/style_audit.py +0 -575
  136. package/bin/skills-assets/xlsx/scripts/xlsx_add_column.py +0 -395
  137. package/bin/skills-assets/xlsx/scripts/xlsx_insert_row.py +0 -274
  138. package/bin/skills-assets/xlsx/scripts/xlsx_pack.py +0 -87
  139. package/bin/skills-assets/xlsx/scripts/xlsx_reader.py +0 -362
  140. package/bin/skills-assets/xlsx/scripts/xlsx_shift_rows.py +0 -396
  141. package/bin/skills-assets/xlsx/scripts/xlsx_unpack.py +0 -130
  142. package/bin/skills-assets/xlsx/templates/minimal_xlsx/[Content_Types].xml +0 -9
  143. package/bin/skills-assets/xlsx/templates/minimal_xlsx/_rels/.rels +0 -6
  144. package/bin/skills-assets/xlsx/templates/minimal_xlsx/xl/_rels/workbook.xml.rels +0 -19
  145. package/bin/skills-assets/xlsx/templates/minimal_xlsx/xl/sharedStrings.xml +0 -33
  146. package/bin/skills-assets/xlsx/templates/minimal_xlsx/xl/styles.xml +0 -160
  147. package/bin/skills-assets/xlsx/templates/minimal_xlsx/xl/workbook.xml +0 -30
  148. package/bin/skills-assets/xlsx/templates/minimal_xlsx/xl/worksheets/sheet1.xml +0 -70
@@ -1,595 +0,0 @@
1
- using DocumentFormat.OpenXml;
2
- using DocumentFormat.OpenXml.Packaging;
3
- using DocumentFormat.OpenXml.Wordprocessing;
4
-
5
- namespace Docx.Core.Samples;
6
-
7
- /// <summary>
8
- /// Reference implementations for revision tracking (Track Changes).
9
- ///
10
- /// ╔══════════════════════════════════════════════════════════════════╗
11
- /// ║ CRITICAL: w:del uses w:delText, NEVER w:t ║
12
- /// ║ w:ins uses w:t, NEVER w:delText ║
13
- /// ║ Getting this wrong silently corrupts the document. ║
14
- /// ║ Word will open without error but display garbled text or ║
15
- /// ║ lose content when accepting/rejecting changes. ║
16
- /// ╚══════════════════════════════════════════════════════════════════╝
17
- ///
18
- /// KEY CONCEPTS:
19
- /// - Every revision element (ins, del, rPrChange, pPrChange) needs:
20
- /// w:id — unique revision ID (string, must be unique across all revisions)
21
- /// w:author — who made the change
22
- /// w:date — ISO 8601 timestamp
23
- /// - InsertedRun (w:ins) wraps normal Run elements with w:t text
24
- /// - DeletedRun (w:del) wraps Run elements that use DeletedText (w:delText) instead of Text (w:t)
25
- /// - MoveFrom/MoveTo track text that was moved (not just deleted+inserted)
26
- /// </summary>
27
- public static class TrackChangesSamples
28
- {
29
- /// <summary>
30
- /// Thread-safe counter for generating unique revision IDs.
31
- /// In production, scan the document for the max existing ID first.
32
- /// </summary>
33
- private static int s_revisionCounter;
34
-
35
- // ──────────────────────────────────────────────
36
- // 1. EnableTrackChanges
37
- // ──────────────────────────────────────────────
38
-
39
- /// <summary>
40
- /// Enables revision tracking in the document settings.
41
- /// This makes Word record all subsequent edits as tracked changes.
42
- ///
43
- /// Maps to: &lt;w:trackChanges/&gt; in settings.xml
44
- ///
45
- /// Note: This only controls whether NEW edits are tracked.
46
- /// Existing revision marks are always preserved regardless of this setting.
47
- /// </summary>
48
- public static void EnableTrackChanges(DocumentSettingsPart settingsPart)
49
- {
50
- settingsPart.Settings ??= new Settings();
51
-
52
- var existing = settingsPart.Settings.GetFirstChild<TrackRevisions>();
53
- if (existing == null)
54
- {
55
- settingsPart.Settings.Append(new TrackRevisions());
56
- }
57
-
58
- settingsPart.Settings.Save();
59
- }
60
-
61
- // ──────────────────────────────────────────────
62
- // 2. InsertTrackedInsertion — w:ins with w:t
63
- // ──────────────────────────────────────────────
64
-
65
- /// <summary>
66
- /// Inserts text as a tracked insertion (w:ins).
67
- ///
68
- /// ╔══════════════════════════════════════════════════════╗
69
- /// ║ w:ins uses w:t (Text), NOT w:delText. ║
70
- /// ║ The text appears with green underline in Word. ║
71
- /// ╚══════════════════════════════════════════════════════╝
72
- ///
73
- /// XML structure:
74
- /// &lt;w:ins w:id="1" w:author="John" w:date="2026-03-22T00:00:00Z"&gt;
75
- /// &lt;w:r&gt;
76
- /// &lt;w:t&gt;inserted text&lt;/w:t&gt; &lt;!-- w:t, NOT w:delText --&gt;
77
- /// &lt;/w:r&gt;
78
- /// &lt;/w:ins&gt;
79
- /// </summary>
80
- public static InsertedRun InsertTrackedInsertion(Paragraph para, string text, string author)
81
- {
82
- var ins = new InsertedRun
83
- {
84
- Id = GenerateRevisionId(),
85
- Author = author,
86
- Date = DateTime.UtcNow
87
- };
88
-
89
- // CORRECT: w:ins contains w:r with w:t (normal Text element)
90
- ins.Append(new Run(
91
- new Text(text) { Space = SpaceProcessingModeValues.Preserve }));
92
-
93
- para.Append(ins);
94
- return ins;
95
- }
96
-
97
- // ──────────────────────────────────────────────
98
- // 3. InsertTrackedDeletion — w:del with w:delText
99
- // ──────────────────────────────────────────────
100
-
101
- /// <summary>
102
- /// Inserts text as a tracked deletion (w:del).
103
- ///
104
- /// ╔══════════════════════════════════════════════════════╗
105
- /// ║ w:del uses w:delText (DeletedText), NOT w:t. ║
106
- /// ║ Using w:t inside w:del SILENTLY CORRUPTS the file. ║
107
- /// ║ The text appears with red strikethrough in Word. ║
108
- /// ╚══════════════════════════════════════════════════════╝
109
- ///
110
- /// XML structure:
111
- /// &lt;w:del w:id="2" w:author="John" w:date="2026-03-22T00:00:00Z"&gt;
112
- /// &lt;w:r&gt;
113
- /// &lt;w:delText xml:space="preserve"&gt;deleted text&lt;/w:delText&gt; &lt;!-- w:delText, NOT w:t --&gt;
114
- /// &lt;/w:r&gt;
115
- /// &lt;/w:del&gt;
116
- /// </summary>
117
- public static DeletedRun InsertTrackedDeletion(Paragraph para, string deletedText, string author)
118
- {
119
- var del = new DeletedRun
120
- {
121
- Id = GenerateRevisionId(),
122
- Author = author,
123
- Date = DateTime.UtcNow
124
- };
125
-
126
- // CORRECT: w:del contains w:r with w:delText (DeletedText element)
127
- // WRONG would be: new Text(deletedText) — this creates w:t which corrupts the document
128
- del.Append(new Run(
129
- new DeletedText(deletedText) { Space = SpaceProcessingModeValues.Preserve }));
130
-
131
- para.Append(del);
132
- return del;
133
- }
134
-
135
- // ──────────────────────────────────────────────
136
- // 4. InsertFormattingChange — RunPropertiesChange
137
- // ──────────────────────────────────────────────
138
-
139
- /// <summary>
140
- /// Records a formatting change on a run (e.g., text was made bold).
141
- ///
142
- /// RunPropertiesChange (w:rPrChange) stores the PREVIOUS formatting.
143
- /// The current RunProperties on the run reflects the NEW formatting.
144
- ///
145
- /// Example: text changed from normal to bold:
146
- /// &lt;w:rPr&gt;
147
- /// &lt;w:b/&gt; &lt;!-- current: bold --&gt;
148
- /// &lt;w:rPrChange w:id="3" w:author="John" w:date="..."&gt;
149
- /// &lt;w:rPr/&gt; &lt;!-- previous: no bold --&gt;
150
- /// &lt;/w:rPrChange&gt;
151
- /// &lt;/w:rPr&gt;
152
- /// </summary>
153
- public static void InsertFormattingChange(Run run, string author)
154
- {
155
- // Ensure RunProperties exists
156
- run.RunProperties ??= new RunProperties();
157
-
158
- // Store the previous (empty/normal) formatting as the "before" state
159
- var rPrChange = new RunPropertiesChange
160
- {
161
- Id = GenerateRevisionId(),
162
- Author = author,
163
- Date = DateTime.UtcNow
164
- };
165
-
166
- // The child RunProperties inside rPrChange is the OLD formatting (before the change).
167
- // An empty RunProperties means "was default/normal formatting."
168
- rPrChange.Append(new PreviousRunProperties());
169
-
170
- run.RunProperties.Append(rPrChange);
171
- }
172
-
173
- // ──────────────────────────────────────────────
174
- // 5. InsertParagraphFormatChange — ParagraphPropertiesChange
175
- // ──────────────────────────────────────────────
176
-
177
- /// <summary>
178
- /// Records a paragraph formatting change (e.g., alignment changed).
179
- ///
180
- /// ParagraphPropertiesChange (w:pPrChange) stores the PREVIOUS paragraph properties.
181
- /// The current ParagraphProperties reflects the NEW formatting.
182
- ///
183
- /// Example: paragraph changed from left-aligned to centered:
184
- /// &lt;w:pPr&gt;
185
- /// &lt;w:jc w:val="center"/&gt; &lt;!-- current: centered --&gt;
186
- /// &lt;w:pPrChange w:id="4" w:author="John" w:date="..."&gt;
187
- /// &lt;w:pPr&gt;
188
- /// &lt;w:jc w:val="left"/&gt; &lt;!-- previous: left --&gt;
189
- /// &lt;/w:pPr&gt;
190
- /// &lt;/w:pPrChange&gt;
191
- /// &lt;/w:pPr&gt;
192
- /// </summary>
193
- public static void InsertParagraphFormatChange(Paragraph para, string author)
194
- {
195
- para.ParagraphProperties ??= new ParagraphProperties();
196
-
197
- var pPrChange = new ParagraphPropertiesChange
198
- {
199
- Id = GenerateRevisionId(),
200
- Author = author,
201
- Date = DateTime.UtcNow
202
- };
203
-
204
- // Store previous paragraph properties (before the change)
205
- // Example: was left-aligned before changing to whatever the current alignment is
206
- var previousPPr = new ParagraphPropertiesExtended();
207
- previousPPr.Append(new Justification { Val = JustificationValues.Left });
208
- pPrChange.Append(previousPPr);
209
-
210
- para.ParagraphProperties.Append(pPrChange);
211
- }
212
-
213
- // ──────────────────────────────────────────────
214
- // 6. InsertTableRowInsertion — table revision marks
215
- // ──────────────────────────────────────────────
216
-
217
- /// <summary>
218
- /// Marks a table row as a tracked insertion.
219
- ///
220
- /// Table-level track changes use TableRowProperties with InsertedMathControl
221
- /// mapped from w:trPr/w:ins — indicating the entire row was inserted.
222
- ///
223
- /// Structure:
224
- /// &lt;w:tr&gt;
225
- /// &lt;w:trPr&gt;
226
- /// &lt;w:ins w:id="5" w:author="John" w:date="..."/&gt;
227
- /// &lt;/w:trPr&gt;
228
- /// &lt;w:tc&gt;...&lt;/w:tc&gt;
229
- /// &lt;/w:tr&gt;
230
- /// </summary>
231
- public static void InsertTableRowInsertion(TableRow row, string author)
232
- {
233
- row.TableRowProperties ??= new TableRowProperties();
234
-
235
- var inserted = new Inserted
236
- {
237
- Id = GenerateRevisionId(),
238
- Author = author,
239
- Date = DateTime.UtcNow
240
- };
241
-
242
- row.TableRowProperties.Append(inserted);
243
- }
244
-
245
- // ──────────────────────────────────────────────
246
- // 7. AcceptAllRevisions — accept all tracked changes
247
- // ──────────────────────────────────────────────
248
-
249
- /// <summary>
250
- /// Programmatically accepts all tracked changes in the document body.
251
- ///
252
- /// For insertions (w:ins): unwrap the content (keep the runs, remove the w:ins wrapper)
253
- /// For deletions (w:del): remove the entire element (the deleted text disappears)
254
- /// For formatting changes: remove the rPrChange/pPrChange (keep new formatting)
255
- /// For table row insertions: remove the w:ins from trPr
256
- ///
257
- /// ╔══════════════════════════════════════════════════════════════╗
258
- /// ║ Process deletions before insertions to avoid invalidating ║
259
- /// ║ element references. Always call .ToList() before ║
260
- /// ║ iterating to avoid modifying the collection during ║
261
- /// ║ enumeration. ║
262
- /// ╚══════════════════════════════════════════════════════════════╝
263
- /// </summary>
264
- public static void AcceptAllRevisions(Body body)
265
- {
266
- // 1. Accept deletions — remove the w:del and all its content
267
- foreach (var del in body.Descendants<DeletedRun>().ToList())
268
- {
269
- del.Remove();
270
- }
271
-
272
- // 2. Accept insertions — unwrap w:ins, keeping child runs in place
273
- foreach (var ins in body.Descendants<InsertedRun>().ToList())
274
- {
275
- var parent = ins.Parent;
276
- if (parent == null) continue;
277
-
278
- // Move all child elements before the ins element, then remove ins
279
- var children = ins.ChildElements.ToList();
280
- foreach (var child in children)
281
- {
282
- child.Remove();
283
- ins.InsertBeforeSelf(child);
284
- }
285
- ins.Remove();
286
- }
287
-
288
- // 3. Accept formatting changes — remove rPrChange (keep new formatting)
289
- foreach (var rPrChange in body.Descendants<RunPropertiesChange>().ToList())
290
- {
291
- rPrChange.Remove();
292
- }
293
-
294
- // 4. Accept paragraph formatting changes
295
- foreach (var pPrChange in body.Descendants<ParagraphPropertiesChange>().ToList())
296
- {
297
- pPrChange.Remove();
298
- }
299
-
300
- // 5. Accept table row insertions — remove w:ins from trPr
301
- foreach (var inserted in body.Descendants<TableRowProperties>()
302
- .SelectMany(trPr => trPr.Elements<Inserted>()).ToList())
303
- {
304
- inserted.Remove();
305
- }
306
-
307
- // 6. Accept MoveFrom/MoveTo — keep MoveTo content, remove MoveFrom
308
- foreach (var moveFrom in body.Descendants<MoveFromRun>().ToList())
309
- {
310
- moveFrom.Remove();
311
- }
312
- foreach (var moveTo in body.Descendants<MoveToRun>().ToList())
313
- {
314
- var parent = moveTo.Parent;
315
- if (parent == null) continue;
316
- var children = moveTo.ChildElements.ToList();
317
- foreach (var child in children)
318
- {
319
- child.Remove();
320
- moveTo.InsertBeforeSelf(child);
321
- }
322
- moveTo.Remove();
323
- }
324
-
325
- // 7. Remove move range markers
326
- foreach (var marker in body.Descendants<MoveFromRangeStart>().ToList()) marker.Remove();
327
- foreach (var marker in body.Descendants<MoveFromRangeEnd>().ToList()) marker.Remove();
328
- foreach (var marker in body.Descendants<MoveToRangeStart>().ToList()) marker.Remove();
329
- foreach (var marker in body.Descendants<MoveToRangeEnd>().ToList()) marker.Remove();
330
- }
331
-
332
- // ──────────────────────────────────────────────
333
- // 8. RejectAllRevisions — reject all tracked changes
334
- // ──────────────────────────────────────────────
335
-
336
- /// <summary>
337
- /// Programmatically rejects all tracked changes in the document body.
338
- ///
339
- /// For insertions (w:ins): remove the entire element (the inserted text disappears)
340
- /// For deletions (w:del): unwrap the content and convert w:delText back to w:t
341
- /// (the "deleted" text is restored)
342
- /// For formatting changes: restore old formatting from rPrChange/pPrChange
343
- ///
344
- /// ╔══════════════════════════════════════════════════════════════╗
345
- /// ║ When rejecting deletions, you MUST convert w:delText back ║
346
- /// ║ to w:t. Leaving w:delText in a non-deleted run causes ║
347
- /// ║ the text to be invisible in Word. ║
348
- /// ╚══════════════════════════════════════════════════════════════╝
349
- /// </summary>
350
- public static void RejectAllRevisions(Body body)
351
- {
352
- // 1. Reject insertions — remove the entire w:ins and its content
353
- foreach (var ins in body.Descendants<InsertedRun>().ToList())
354
- {
355
- ins.Remove();
356
- }
357
-
358
- // 2. Reject deletions — restore deleted text by unwrapping w:del
359
- // and converting w:delText back to w:t
360
- foreach (var del in body.Descendants<DeletedRun>().ToList())
361
- {
362
- var parent = del.Parent;
363
- if (parent == null) continue;
364
-
365
- // Convert DeletedText -> Text in each run inside the deletion
366
- foreach (var run in del.Elements<Run>().ToList())
367
- {
368
- foreach (var delText in run.Elements<DeletedText>().ToList())
369
- {
370
- // IMPORTANT: convert w:delText back to w:t
371
- var text = new Text(delText.Text ?? "") { Space = SpaceProcessingModeValues.Preserve };
372
- delText.InsertAfterSelf(text);
373
- delText.Remove();
374
- }
375
- }
376
-
377
- // Unwrap — move children before the del element
378
- var children = del.ChildElements.ToList();
379
- foreach (var child in children)
380
- {
381
- child.Remove();
382
- del.InsertBeforeSelf(child);
383
- }
384
- del.Remove();
385
- }
386
-
387
- // 3. Reject formatting changes — restore old RunProperties
388
- foreach (var rPrChange in body.Descendants<RunPropertiesChange>().ToList())
389
- {
390
- var runProperties = rPrChange.Parent as RunProperties;
391
- if (runProperties == null) continue;
392
-
393
- // Get the previous (old) formatting
394
- var previousRPr = rPrChange.GetFirstChild<PreviousRunProperties>();
395
- if (previousRPr != null)
396
- {
397
- // Remove current formatting (except the rPrChange itself)
398
- var currentProps = runProperties.ChildElements
399
- .Where(c => c is not RunPropertiesChange).ToList();
400
- foreach (var prop in currentProps)
401
- {
402
- prop.Remove();
403
- }
404
-
405
- // Restore old formatting from PreviousRunProperties
406
- foreach (var oldProp in previousRPr.ChildElements.ToList())
407
- {
408
- oldProp.Remove();
409
- runProperties.Append(oldProp);
410
- }
411
- }
412
- rPrChange.Remove();
413
- }
414
-
415
- // 4. Reject paragraph formatting changes — restore old ParagraphProperties
416
- foreach (var pPrChange in body.Descendants<ParagraphPropertiesChange>().ToList())
417
- {
418
- var paragraphProperties = pPrChange.Parent as ParagraphProperties;
419
- if (paragraphProperties == null) continue;
420
-
421
- var previousPPr = pPrChange.GetFirstChild<ParagraphPropertiesExtended>();
422
- if (previousPPr != null)
423
- {
424
- var currentProps = paragraphProperties.ChildElements
425
- .Where(c => c is not ParagraphPropertiesChange).ToList();
426
- foreach (var prop in currentProps)
427
- {
428
- prop.Remove();
429
- }
430
- foreach (var oldProp in previousPPr.ChildElements.ToList())
431
- {
432
- oldProp.Remove();
433
- paragraphProperties.Append(oldProp);
434
- }
435
- }
436
- pPrChange.Remove();
437
- }
438
-
439
- // 5. Reject table row insertions — remove the entire row
440
- foreach (var row in body.Descendants<TableRow>().ToList())
441
- {
442
- var trPr = row.TableRowProperties;
443
- if (trPr?.GetFirstChild<Inserted>() != null)
444
- {
445
- row.Remove();
446
- }
447
- }
448
-
449
- // 6. Reject MoveFrom/MoveTo — keep MoveFrom content (original position), remove MoveTo
450
- foreach (var moveTo in body.Descendants<MoveToRun>().ToList())
451
- {
452
- moveTo.Remove();
453
- }
454
- foreach (var moveFrom in body.Descendants<MoveFromRun>().ToList())
455
- {
456
- var parent = moveFrom.Parent;
457
- if (parent == null) continue;
458
-
459
- // Convert any DeletedText back to Text in MoveFrom runs
460
- foreach (var run in moveFrom.Elements<Run>().ToList())
461
- {
462
- foreach (var delText in run.Elements<DeletedText>().ToList())
463
- {
464
- var text = new Text(delText.Text ?? "") { Space = SpaceProcessingModeValues.Preserve };
465
- delText.InsertAfterSelf(text);
466
- delText.Remove();
467
- }
468
- }
469
-
470
- var children = moveFrom.ChildElements.ToList();
471
- foreach (var child in children)
472
- {
473
- child.Remove();
474
- moveFrom.InsertBeforeSelf(child);
475
- }
476
- moveFrom.Remove();
477
- }
478
-
479
- // 7. Remove move range markers
480
- foreach (var marker in body.Descendants<MoveFromRangeStart>().ToList()) marker.Remove();
481
- foreach (var marker in body.Descendants<MoveFromRangeEnd>().ToList()) marker.Remove();
482
- foreach (var marker in body.Descendants<MoveToRangeStart>().ToList()) marker.Remove();
483
- foreach (var marker in body.Descendants<MoveToRangeEnd>().ToList()) marker.Remove();
484
- }
485
-
486
- // ──────────────────────────────────────────────
487
- // 9. InsertMoveFromTo — MoveFrom + MoveTo blocks
488
- // ──────────────────────────────────────────────
489
-
490
- /// <summary>
491
- /// Creates a tracked move operation (text moved from one location to another).
492
- ///
493
- /// A move consists of:
494
- /// - MoveFromRangeStart/End markers around the original location
495
- /// - MoveFrom (w:moveFrom) containing the original text with w:delText
496
- /// - MoveToRangeStart/End markers around the new location
497
- /// - MoveTo (w:moveTo) containing the moved text with w:t
498
- /// - Both share the same name attribute to link them
499
- ///
500
- /// ╔══════════════════════════════════════════════════════════════╗
501
- /// ║ MoveFrom uses w:delText (like w:del — text is "leaving") ║
502
- /// ║ MoveTo uses w:t (like w:ins — text is "arriving") ║
503
- /// ╚══════════════════════════════════════════════════════════════╝
504
- /// </summary>
505
- public static void InsertMoveFromTo(Body body, string movedText, string author)
506
- {
507
- string moveId = GenerateRevisionId();
508
- string moveId2 = GenerateRevisionId();
509
- string moveName = "move" + moveId;
510
-
511
- // ── MoveFrom paragraph (original location — text shown with strikethrough) ──
512
- var moveFromPara = new Paragraph();
513
-
514
- moveFromPara.Append(new MoveFromRangeStart
515
- {
516
- Id = moveId,
517
- Author = author,
518
- Date = DateTime.UtcNow,
519
- Name = moveName
520
- });
521
-
522
- var moveFrom = new MoveFromRun
523
- {
524
- Id = GenerateRevisionId(),
525
- Author = author,
526
- Date = DateTime.UtcNow
527
- };
528
-
529
- // MoveFrom uses DeletedText (w:delText), NOT Text (w:t)
530
- // The text is visually struck through in Word
531
- moveFrom.Append(new Run(
532
- new DeletedText(movedText) { Space = SpaceProcessingModeValues.Preserve }));
533
-
534
- moveFromPara.Append(moveFrom);
535
- moveFromPara.Append(new MoveFromRangeEnd { Id = moveId });
536
-
537
- body.Append(moveFromPara);
538
-
539
- // ── MoveTo paragraph (destination — text shown with double underline) ──
540
- var moveToPara = new Paragraph();
541
-
542
- moveToPara.Append(new MoveToRangeStart
543
- {
544
- Id = moveId2,
545
- Author = author,
546
- Date = DateTime.UtcNow,
547
- Name = moveName
548
- });
549
-
550
- var moveTo = new MoveToRun
551
- {
552
- Id = GenerateRevisionId(),
553
- Author = author,
554
- Date = DateTime.UtcNow
555
- };
556
-
557
- // MoveTo uses Text (w:t), NOT DeletedText (w:delText)
558
- // The text is visually double-underlined in green in Word
559
- moveTo.Append(new Run(
560
- new Text(movedText) { Space = SpaceProcessingModeValues.Preserve }));
561
-
562
- moveToPara.Append(moveTo);
563
- moveToPara.Append(new MoveToRangeEnd { Id = moveId2 });
564
-
565
- body.Append(moveToPara);
566
- }
567
-
568
- // ──────────────────────────────────────────────
569
- // 10. GenerateRevisionId — unique ID pattern
570
- // ──────────────────────────────────────────────
571
-
572
- /// <summary>
573
- /// Generates a unique revision ID string.
574
- ///
575
- /// Revision IDs (w:id) must be unique across ALL revision elements in the document:
576
- /// ins, del, rPrChange, pPrChange, moveFrom, moveTo, table row ins/del, etc.
577
- ///
578
- /// Word uses simple incrementing integers starting from 0.
579
- /// When programmatically adding revisions to an existing document,
580
- /// first scan for the maximum existing ID and start from there.
581
- ///
582
- /// For new documents, a simple counter suffices.
583
- /// For existing documents, use:
584
- /// int maxId = body.Descendants()
585
- /// .SelectMany(e => e.GetAttributes())
586
- /// .Where(a => a.LocalName == "id")
587
- /// .Select(a => int.TryParse(a.Value, out int v) ? v : 0)
588
- /// .DefaultIfEmpty(0)
589
- /// .Max();
590
- /// </summary>
591
- public static string GenerateRevisionId()
592
- {
593
- return Interlocked.Increment(ref s_revisionCounter).ToString();
594
- }
595
- }
@@ -1,39 +0,0 @@
1
- using DocumentFormat.OpenXml.Wordprocessing;
2
-
3
- namespace Docx.Core.Typography;
4
-
5
- /// <summary>
6
- /// CJK mixed typography helpers for East Asian font and paragraph configuration.
7
- /// </summary>
8
- public static class CjkHelper
9
- {
10
- public const string DefaultSimplifiedChinese = "SimSun";
11
- public const string DefaultJapanese = "MS Mincho";
12
- public const string DefaultKorean = "Batang";
13
-
14
- /// <summary>
15
- /// Sets the East Asia font on run properties.
16
- /// </summary>
17
- public static void SetEastAsiaFont(RunProperties rPr, string fontName)
18
- {
19
- var fonts = rPr.RunFonts;
20
- if (fonts == null)
21
- {
22
- fonts = new RunFonts();
23
- rPr.RunFonts = fonts;
24
- }
25
- fonts.EastAsia = fontName;
26
- }
27
-
28
- /// <summary>
29
- /// Configures CJK-appropriate paragraph properties.
30
- /// </summary>
31
- public static void ConfigureCjkParagraph(ParagraphProperties pPr)
32
- {
33
- // Enable word wrap for CJK
34
- pPr.WordWrap = new WordWrap { Val = true };
35
- // Allow auto space between CJK and Latin/numbers
36
- pPr.AutoSpaceDE = new AutoSpaceDE { Val = true };
37
- pPr.AutoSpaceDN = new AutoSpaceDN { Val = true };
38
- }
39
- }
@@ -1,24 +0,0 @@
1
- namespace Docx.Core.Typography;
2
-
3
- public record FontConfig(
4
- string BodyFont,
5
- string HeadingFont,
6
- double BodySize,
7
- double Heading1Size,
8
- double Heading2Size,
9
- double Heading3Size,
10
- double Heading4Size,
11
- double Heading5Size,
12
- double Heading6Size,
13
- double LineSpacing);
14
-
15
- /// <summary>
16
- /// Default font configurations by document type.
17
- /// </summary>
18
- public static class FontDefaults
19
- {
20
- public static FontConfig Report => new("Calibri", "Calibri Light", 11.0, 26.0, 20.0, 16.0, 14.0, 12.0, 11.0, 1.15);
21
- public static FontConfig Letter => new("Calibri", "Calibri", 11.0, 16.0, 14.0, 12.0, 11.0, 11.0, 11.0, 1.0);
22
- public static FontConfig Memo => new("Arial", "Arial", 11.0, 16.0, 14.0, 12.0, 11.0, 11.0, 11.0, 1.15);
23
- public static FontConfig Academic => new("Times New Roman", "Times New Roman", 12.0, 16.0, 14.0, 13.0, 12.0, 12.0, 12.0, 2.0);
24
- }
@@ -1,20 +0,0 @@
1
- namespace Docx.Core.Typography;
2
-
3
- public record PageSize(int WidthDxa, int HeightDxa);
4
- public record MarginConfig(int TopDxa, int BottomDxa, int LeftDxa, int RightDxa);
5
-
6
- /// <summary>
7
- /// Standard page sizes and margin presets in DXA units.
8
- /// </summary>
9
- public static class PageSizes
10
- {
11
- public static PageSize Letter => new(12240, 15840); // 8.5 x 11 inches
12
- public static PageSize A4 => new(11906, 16838); // 210 x 297 mm
13
- public static PageSize Legal => new(12240, 20160); // 8.5 x 14 inches
14
- public static PageSize A3 => new(16838, 23811); // 297 x 420 mm
15
- public static PageSize A5 => new(8391, 11906); // 148 x 210 mm
16
-
17
- public static MarginConfig StandardMargins => new(1440, 1440, 1440, 1440); // 1 inch all
18
- public static MarginConfig NarrowMargins => new(720, 720, 720, 720); // 0.5 inch all
19
- public static MarginConfig WideMargins => new(1440, 1440, 2160, 2160); // 1" top/bottom, 1.5" left/right
20
- }