docxmlater 10.3.6 → 10.4.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.
Files changed (184) hide show
  1. package/README.md +158 -7
  2. package/dist/core/Document.d.ts +97 -3
  3. package/dist/core/Document.d.ts.map +1 -1
  4. package/dist/core/Document.js +727 -50
  5. package/dist/core/Document.js.map +1 -1
  6. package/dist/core/DocumentContent.d.ts.map +1 -1
  7. package/dist/core/DocumentContent.js +0 -8
  8. package/dist/core/DocumentContent.js.map +1 -1
  9. package/dist/core/DocumentGenerator.d.ts.map +1 -1
  10. package/dist/core/DocumentGenerator.js +9 -5
  11. package/dist/core/DocumentGenerator.js.map +1 -1
  12. package/dist/core/DocumentParser.d.ts.map +1 -1
  13. package/dist/core/DocumentParser.js +573 -101
  14. package/dist/core/DocumentParser.js.map +1 -1
  15. package/dist/core/RelationshipManager.d.ts.map +1 -1
  16. package/dist/core/RelationshipManager.js +4 -3
  17. package/dist/core/RelationshipManager.js.map +1 -1
  18. package/dist/elements/Bookmark.d.ts +7 -0
  19. package/dist/elements/Bookmark.d.ts.map +1 -1
  20. package/dist/elements/Bookmark.js +24 -4
  21. package/dist/elements/Bookmark.js.map +1 -1
  22. package/dist/elements/BookmarkManager.d.ts.map +1 -1
  23. package/dist/elements/BookmarkManager.js +4 -3
  24. package/dist/elements/BookmarkManager.js.map +1 -1
  25. package/dist/elements/CommonTypes.d.ts +2 -2
  26. package/dist/elements/CommonTypes.d.ts.map +1 -1
  27. package/dist/elements/CommonTypes.js +14 -1
  28. package/dist/elements/CommonTypes.js.map +1 -1
  29. package/dist/elements/Field.d.ts +1 -1
  30. package/dist/elements/Field.d.ts.map +1 -1
  31. package/dist/elements/Field.js +1 -1
  32. package/dist/elements/Field.js.map +1 -1
  33. package/dist/elements/Footer.d.ts +2 -0
  34. package/dist/elements/Footer.d.ts.map +1 -1
  35. package/dist/elements/Footer.js +6 -0
  36. package/dist/elements/Footer.js.map +1 -1
  37. package/dist/elements/Header.d.ts +2 -0
  38. package/dist/elements/Header.d.ts.map +1 -1
  39. package/dist/elements/Header.js +6 -0
  40. package/dist/elements/Header.js.map +1 -1
  41. package/dist/elements/Image.d.ts.map +1 -1
  42. package/dist/elements/Image.js +3 -0
  43. package/dist/elements/Image.js.map +1 -1
  44. package/dist/elements/Paragraph.d.ts +81 -1
  45. package/dist/elements/Paragraph.d.ts.map +1 -1
  46. package/dist/elements/Paragraph.js +515 -21
  47. package/dist/elements/Paragraph.js.map +1 -1
  48. package/dist/elements/Revision.d.ts +0 -1
  49. package/dist/elements/Revision.d.ts.map +1 -1
  50. package/dist/elements/Revision.js +0 -12
  51. package/dist/elements/Revision.js.map +1 -1
  52. package/dist/elements/RevisionManager.d.ts +0 -1
  53. package/dist/elements/RevisionManager.d.ts.map +1 -1
  54. package/dist/elements/RevisionManager.js +0 -2
  55. package/dist/elements/RevisionManager.js.map +1 -1
  56. package/dist/elements/Run.d.ts +16 -4
  57. package/dist/elements/Run.d.ts.map +1 -1
  58. package/dist/elements/Run.js +114 -22
  59. package/dist/elements/Run.js.map +1 -1
  60. package/dist/elements/Section.d.ts +7 -1
  61. package/dist/elements/Section.d.ts.map +1 -1
  62. package/dist/elements/Section.js +185 -4
  63. package/dist/elements/Section.js.map +1 -1
  64. package/dist/elements/Shape.js.map +1 -1
  65. package/dist/elements/Table.d.ts +30 -1
  66. package/dist/elements/Table.d.ts.map +1 -1
  67. package/dist/elements/Table.js +357 -40
  68. package/dist/elements/Table.js.map +1 -1
  69. package/dist/elements/TableCell.d.ts +3 -0
  70. package/dist/elements/TableCell.d.ts.map +1 -1
  71. package/dist/elements/TableCell.js +30 -3
  72. package/dist/elements/TableCell.js.map +1 -1
  73. package/dist/elements/TableGridChange.d.ts +0 -1
  74. package/dist/elements/TableGridChange.d.ts.map +1 -1
  75. package/dist/elements/TableGridChange.js +0 -10
  76. package/dist/elements/TableGridChange.js.map +1 -1
  77. package/dist/elements/TableRow.d.ts +4 -0
  78. package/dist/elements/TableRow.d.ts.map +1 -1
  79. package/dist/elements/TableRow.js +31 -3
  80. package/dist/elements/TableRow.js.map +1 -1
  81. package/dist/formatting/AbstractNumbering.d.ts +5 -0
  82. package/dist/formatting/AbstractNumbering.d.ts.map +1 -1
  83. package/dist/formatting/AbstractNumbering.js +22 -0
  84. package/dist/formatting/AbstractNumbering.js.map +1 -1
  85. package/dist/formatting/NumberingLevel.d.ts.map +1 -1
  86. package/dist/formatting/NumberingLevel.js +3 -3
  87. package/dist/formatting/NumberingLevel.js.map +1 -1
  88. package/dist/formatting/Style.d.ts +1 -0
  89. package/dist/formatting/Style.d.ts.map +1 -1
  90. package/dist/formatting/Style.js +25 -59
  91. package/dist/formatting/Style.js.map +1 -1
  92. package/dist/formatting/StylesManager.d.ts +1 -0
  93. package/dist/formatting/StylesManager.d.ts.map +1 -1
  94. package/dist/formatting/StylesManager.js +12 -0
  95. package/dist/formatting/StylesManager.js.map +1 -1
  96. package/dist/helpers/CleanupHelper.js.map +1 -1
  97. package/dist/images/ImageOptimizer.d.ts.map +1 -1
  98. package/dist/images/ImageOptimizer.js +0 -1
  99. package/dist/images/ImageOptimizer.js.map +1 -1
  100. package/dist/index.d.ts +1 -1
  101. package/dist/index.d.ts.map +1 -1
  102. package/dist/index.js.map +1 -1
  103. package/dist/managers/DrawingManager.d.ts.map +1 -1
  104. package/dist/managers/DrawingManager.js +4 -2
  105. package/dist/managers/DrawingManager.js.map +1 -1
  106. package/dist/types/formatting.d.ts +2 -2
  107. package/dist/types/formatting.d.ts.map +1 -1
  108. package/dist/types/formatting.js.map +1 -1
  109. package/dist/utils/ChangelogGenerator.d.ts +2 -2
  110. package/dist/utils/ChangelogGenerator.d.ts.map +1 -1
  111. package/dist/utils/ChangelogGenerator.js +4 -5
  112. package/dist/utils/ChangelogGenerator.js.map +1 -1
  113. package/dist/utils/InMemoryRevisionAcceptor.d.ts.map +1 -1
  114. package/dist/utils/InMemoryRevisionAcceptor.js +0 -1
  115. package/dist/utils/InMemoryRevisionAcceptor.js.map +1 -1
  116. package/dist/utils/RevisionAwareProcessor.d.ts +2 -2
  117. package/dist/utils/RevisionAwareProcessor.d.ts.map +1 -1
  118. package/dist/utils/RevisionAwareProcessor.js +2 -2
  119. package/dist/utils/RevisionAwareProcessor.js.map +1 -1
  120. package/dist/utils/SelectiveRevisionAcceptor.d.ts +0 -2
  121. package/dist/utils/SelectiveRevisionAcceptor.d.ts.map +1 -1
  122. package/dist/utils/SelectiveRevisionAcceptor.js +0 -26
  123. package/dist/utils/SelectiveRevisionAcceptor.js.map +1 -1
  124. package/dist/utils/ShadingResolver.d.ts.map +1 -1
  125. package/dist/utils/ShadingResolver.js.map +1 -1
  126. package/dist/utils/acceptRevisions.js +1 -1
  127. package/dist/utils/acceptRevisions.js.map +1 -1
  128. package/dist/utils/stripTrackedChanges.js +1 -1
  129. package/dist/utils/stripTrackedChanges.js.map +1 -1
  130. package/dist/utils/units.d.ts.map +1 -1
  131. package/dist/utils/units.js +1 -1
  132. package/dist/utils/units.js.map +1 -1
  133. package/dist/validation/RevisionAutoFixer.d.ts +2 -1
  134. package/dist/validation/RevisionAutoFixer.d.ts.map +1 -1
  135. package/dist/validation/RevisionAutoFixer.js.map +1 -1
  136. package/package.json +10 -1
  137. package/src/constants/CLAUDE.md +28 -0
  138. package/src/core/CLAUDE.md +4 -0
  139. package/src/core/Document.ts +1755 -85
  140. package/src/core/DocumentContent.ts +0 -11
  141. package/src/core/DocumentGenerator.ts +11 -12
  142. package/src/core/DocumentParser.ts +599 -138
  143. package/src/core/RelationshipManager.ts +6 -3
  144. package/src/elements/Bookmark.ts +39 -4
  145. package/src/elements/BookmarkManager.ts +4 -3
  146. package/src/elements/CLAUDE.md +18 -2
  147. package/src/elements/CommonTypes.ts +35 -8
  148. package/src/elements/Field.ts +1 -1
  149. package/src/elements/Footer.ts +23 -0
  150. package/src/elements/Header.ts +25 -0
  151. package/src/elements/Image.ts +5 -0
  152. package/src/elements/Paragraph.ts +1069 -41
  153. package/src/elements/Revision.ts +0 -19
  154. package/src/elements/RevisionManager.ts +1 -3
  155. package/src/elements/Run.ts +265 -35
  156. package/src/elements/Section.ts +214 -8
  157. package/src/elements/Shape.ts +1 -1
  158. package/src/elements/Table.ts +850 -61
  159. package/src/elements/TableCell.ts +84 -10
  160. package/src/elements/TableGridChange.ts +2 -16
  161. package/src/elements/TableRow.ts +94 -9
  162. package/src/formatting/AbstractNumbering.ts +42 -1
  163. package/src/formatting/CLAUDE.md +4 -0
  164. package/src/formatting/NumberingLevel.ts +11 -7
  165. package/src/formatting/Style.ts +39 -71
  166. package/src/formatting/StylesManager.ts +36 -0
  167. package/src/helpers/CleanupHelper.ts +1 -1
  168. package/src/images/ImageOptimizer.ts +0 -3
  169. package/src/index.ts +1 -1
  170. package/src/managers/DrawingManager.ts +5 -3
  171. package/src/tracking/CLAUDE.md +30 -0
  172. package/src/types/CLAUDE.md +39 -0
  173. package/src/types/formatting.ts +2 -2
  174. package/src/utils/CLAUDE.md +15 -0
  175. package/src/utils/ChangelogGenerator.ts +4 -5
  176. package/src/utils/InMemoryRevisionAcceptor.ts +0 -9
  177. package/src/utils/RevisionAwareProcessor.ts +2 -3
  178. package/src/utils/SelectiveRevisionAcceptor.ts +0 -39
  179. package/src/utils/ShadingResolver.ts +0 -1
  180. package/src/utils/acceptRevisions.ts +1 -1
  181. package/src/utils/stripTrackedChanges.ts +1 -1
  182. package/src/utils/units.ts +2 -1
  183. package/src/validation/CLAUDE.md +40 -0
  184. package/src/validation/RevisionAutoFixer.ts +2 -1
@@ -1 +1 @@
1
- {"version":3,"file":"units.js","sourceRoot":"","sources":["../../src/utils/units.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Unit Conversion Utilities\n *\n * Word documents use multiple measurement units:\n * - Twips: 1/20th of a point (used for most measurements like margins, indents)\n * - EMUs: English Metric Units (used for DrawingML, images)\n * - Points: Typography unit (72 points = 1 inch)\n * - Pixels: Screen measurement (depends on DPI)\n * - Inches/Centimeters: Human-readable units\n *\n * Conversion factors:\n * - 1 inch = 72 points = 1440 twips = 914,400 EMUs\n * - 1 cm = 0.393701 inches = 360,000 EMUs\n * - 1 point = 20 twips = 12,700 EMUs\n */\n\n/**\n * Standard DPI (dots per inch) for screen displays\n */\nexport const STANDARD_DPI = 96;\n\n/**\n * Conversion constants\n */\nexport const UNITS = {\n /** EMUs per inch */\n EMUS_PER_INCH: 914400,\n /** Twips per inch */\n TWIPS_PER_INCH: 1440,\n /** Points per inch */\n POINTS_PER_INCH: 72,\n /** Twips per point */\n TWIPS_PER_POINT: 20,\n /** EMUs per twip */\n EMUS_PER_TWIP: 635,\n /** EMUs per point */\n EMUS_PER_POINT: 12700,\n /** EMUs per centimeter */\n EMUS_PER_CM: 360000,\n /** Inches per centimeter */\n INCHES_PER_CM: 0.393701,\n /** Centimeters per inch */\n CM_PER_INCH: 2.54,\n /** Half-points per point (Word uses half-points for font sizes) */\n HALF_POINTS_PER_POINT: 2,\n} as const;\n\n// ============================================================================\n// Twips Conversions\n// ============================================================================\n\n/**\n * Converts twips to points\n * @param twips Value in twips\n * @returns Value in points\n */\nexport function twipsToPoints(twips: number): number {\n return twips / UNITS.TWIPS_PER_POINT;\n}\n\n/**\n * Converts twips to inches\n * @param twips Value in twips\n * @returns Value in inches\n */\nexport function twipsToInches(twips: number): number {\n return twips / UNITS.TWIPS_PER_INCH;\n}\n\n/**\n * Converts twips to centimeters\n * @param twips Value in twips\n * @returns Value in centimeters\n */\nexport function twipsToCm(twips: number): number {\n return twipsToInches(twips) * UNITS.CM_PER_INCH;\n}\n\n/**\n * Converts twips to EMUs\n * @param twips Value in twips\n * @returns Value in EMUs\n */\nexport function twipsToEmus(twips: number): number {\n return Math.round(twips * UNITS.EMUS_PER_TWIP);\n}\n\n// ============================================================================\n// EMUs Conversions\n// ============================================================================\n\n/**\n * Converts EMUs to twips\n * @param emus Value in EMUs\n * @returns Value in twips\n */\nexport function emusToTwips(emus: number): number {\n return Math.round(emus / UNITS.EMUS_PER_TWIP);\n}\n\n/**\n * Converts EMUs to inches\n * @param emus Value in EMUs\n * @returns Value in inches\n */\nexport function emusToInches(emus: number): number {\n return emus / UNITS.EMUS_PER_INCH;\n}\n\n/**\n * Converts EMUs to centimeters\n * @param emus Value in EMUs\n * @returns Value in centimeters\n */\nexport function emusToCm(emus: number): number {\n return emus / UNITS.EMUS_PER_CM;\n}\n\n/**\n * Converts EMUs to points\n * @param emus Value in EMUs\n * @returns Value in points\n */\nexport function emusToPoints(emus: number): number {\n return emus / UNITS.EMUS_PER_POINT;\n}\n\n/**\n * Converts EMUs to pixels\n * @param emus Value in EMUs\n * @param dpi Dots per inch (default: 96)\n * @returns Value in pixels\n */\nexport function emusToPixels(emus: number, dpi: number = STANDARD_DPI): number {\n return Math.round((emus / UNITS.EMUS_PER_INCH) * dpi);\n}\n\n// ============================================================================\n// Points Conversions\n// ============================================================================\n\n/**\n * Converts points to twips\n * @param points Value in points\n * @returns Value in twips\n */\nexport function pointsToTwips(points: number): number {\n return points * UNITS.TWIPS_PER_POINT;\n}\n\n/**\n * Converts points to EMUs\n * @param points Value in points\n * @returns Value in EMUs\n */\nexport function pointsToEmus(points: number): number {\n return Math.round(points * UNITS.EMUS_PER_POINT);\n}\n\n/**\n * Converts points to inches\n * @param points Value in points\n * @returns Value in inches\n */\nexport function pointsToInches(points: number): number {\n return points / UNITS.POINTS_PER_INCH;\n}\n\n/**\n * Converts points to centimeters\n * @param points Value in points\n * @returns Value in centimeters\n */\nexport function pointsToCm(points: number): number {\n return pointsToInches(points) * UNITS.CM_PER_INCH;\n}\n\n// ============================================================================\n// Half-Points Conversions (Word uses half-points for font sizes)\n// ============================================================================\n\n/**\n * Converts points to half-points (for Word font size storage)\n * @param points Value in points\n * @returns Value in half-points\n */\nexport function pointsToHalfPoints(points: number): number {\n return points * UNITS.HALF_POINTS_PER_POINT;\n}\n\n/**\n * Converts half-points to points (from Word font size storage)\n * @param halfPoints Value in half-points\n * @returns Value in points\n */\nexport function halfPointsToPoints(halfPoints: number): number {\n return halfPoints / UNITS.HALF_POINTS_PER_POINT;\n}\n\n// ============================================================================\n// Inches Conversions\n// ============================================================================\n\n/**\n * Converts inches to twips\n * @param inches Value in inches\n * @returns Value in twips\n */\nexport function inchesToTwips(inches: number): number {\n return Math.round(inches * UNITS.TWIPS_PER_INCH);\n}\n\n/**\n * Converts inches to EMUs\n * @param inches Value in inches\n * @returns Value in EMUs\n */\nexport function inchesToEmus(inches: number): number {\n return Math.round(inches * UNITS.EMUS_PER_INCH);\n}\n\n/**\n * Converts inches to points\n * @param inches Value in inches\n * @returns Value in points\n */\nexport function inchesToPoints(inches: number): number {\n return inches * UNITS.POINTS_PER_INCH;\n}\n\n/**\n * Converts inches to centimeters\n * @param inches Value in inches\n * @returns Value in centimeters\n */\nexport function inchesToCm(inches: number): number {\n return inches * UNITS.CM_PER_INCH;\n}\n\n/**\n * Converts inches to pixels\n * @param inches Value in inches\n * @param dpi Dots per inch (default: 96)\n * @returns Value in pixels\n */\nexport function inchesToPixels(inches: number, dpi: number = STANDARD_DPI): number {\n return Math.round(inches * dpi);\n}\n\n// ============================================================================\n// Centimeters Conversions\n// ============================================================================\n\n/**\n * Converts centimeters to twips\n * @param cm Value in centimeters\n * @returns Value in twips\n */\nexport function cmToTwips(cm: number): number {\n return inchesToTwips(cm * UNITS.INCHES_PER_CM);\n}\n\n/**\n * Converts centimeters to EMUs\n * @param cm Value in centimeters\n * @returns Value in EMUs\n */\nexport function cmToEmus(cm: number): number {\n return Math.round(cm * UNITS.EMUS_PER_CM);\n}\n\n/**\n * Converts centimeters to inches\n * @param cm Value in centimeters\n * @returns Value in inches\n */\nexport function cmToInches(cm: number): number {\n return cm * UNITS.INCHES_PER_CM;\n}\n\n/**\n * Converts centimeters to points\n * @param cm Value in centimeters\n * @returns Value in points\n */\nexport function cmToPoints(cm: number): number {\n return inchesToPoints(cmToInches(cm));\n}\n\n/**\n * Converts centimeters to pixels\n * @param cm Value in centimeters\n * @param dpi Dots per inch (default: 96)\n * @returns Value in pixels\n */\nexport function cmToPixels(cm: number, dpi: number = STANDARD_DPI): number {\n return inchesToPixels(cmToInches(cm), dpi);\n}\n\n// ============================================================================\n// Pixels Conversions\n// ============================================================================\n\n/**\n * Converts pixels to EMUs\n * @param pixels Value in pixels\n * @param dpi Dots per inch (default: 96)\n * @returns Value in EMUs\n */\nexport function pixelsToEmus(pixels: number, dpi: number = STANDARD_DPI): number {\n return Math.round((pixels / dpi) * UNITS.EMUS_PER_INCH);\n}\n\n/**\n * Converts pixels to inches\n * @param pixels Value in pixels\n * @param dpi Dots per inch (default: 96)\n * @returns Value in inches\n */\nexport function pixelsToInches(pixels: number, dpi: number = STANDARD_DPI): number {\n return pixels / dpi;\n}\n\n/**\n * Converts pixels to twips\n * @param pixels Value in pixels\n * @param dpi Dots per inch (default: 96)\n * @returns Value in twips\n */\nexport function pixelsToTwips(pixels: number, dpi: number = STANDARD_DPI): number {\n return inchesToTwips(pixelsToInches(pixels, dpi));\n}\n\n/**\n * Converts pixels to centimeters\n * @param pixels Value in pixels\n * @param dpi Dots per inch (default: 96)\n * @returns Value in centimeters\n */\nexport function pixelsToCm(pixels: number, dpi: number = STANDARD_DPI): number {\n return pixelsToInches(pixels, dpi) * UNITS.CM_PER_INCH;\n}\n\n/**\n * Converts pixels to points\n * @param pixels Value in pixels\n * @param dpi Dots per inch (default: 96)\n * @returns Value in points\n */\nexport function pixelsToPoints(pixels: number, dpi: number = STANDARD_DPI): number {\n return inchesToPoints(pixelsToInches(pixels, dpi));\n}\n\n// ============================================================================\n// Common Document Sizes (in twips)\n// ============================================================================\n\n/**\n * Common page sizes in twips\n */\nexport const PAGE_SIZES = {\n /** Letter (8.5\" x 11\") */\n LETTER: {\n width: 12240, // 8.5 inches\n height: 15840, // 11 inches\n },\n /** A4 (21cm x 29.7cm) */\n A4: {\n width: 11906, // 21cm\n height: 16838, // 29.7cm\n },\n /** Legal (8.5\" x 14\") */\n LEGAL: {\n width: 12240, // 8.5 inches\n height: 20160, // 14 inches\n },\n /** Tabloid (11\" x 17\") */\n TABLOID: {\n width: 15840, // 11 inches\n height: 24480, // 17 inches\n },\n /** A3 (29.7cm x 42cm) */\n A3: {\n width: 16838, // 29.7cm\n height: 23811, // 42cm\n },\n} as const;\n\n/**\n * Common margin sizes in twips\n */\nexport const COMMON_MARGINS = {\n /** Normal margins (1 inch all around) */\n NORMAL: {\n top: 1440,\n bottom: 1440,\n left: 1440,\n right: 1440,\n },\n /** Narrow margins (0.5 inch all around) */\n NARROW: {\n top: 720,\n bottom: 720,\n left: 720,\n right: 720,\n },\n /** Wide margins (2 inches left/right, 1 inch top/bottom) */\n WIDE: {\n top: 1440,\n bottom: 1440,\n left: 2880,\n right: 2880,\n },\n /** Moderate margins (1 inch top/bottom, 0.75 inch left/right) */\n MODERATE: {\n top: 1440,\n bottom: 1440,\n left: 1080,\n right: 1080,\n },\n} as const;\n"]}
1
+ {"version":3,"file":"units.js","sourceRoot":"","sources":["../../src/utils/units.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Unit Conversion Utilities\n *\n * Word documents use multiple measurement units:\n * - Twips: 1/20th of a point (used for most measurements like margins, indents)\n * - EMUs: English Metric Units (used for DrawingML, images)\n * - Points: Typography unit (72 points = 1 inch)\n * - Pixels: Screen measurement (depends on DPI)\n * - Inches/Centimeters: Human-readable units\n *\n * Conversion factors:\n * - 1 inch = 72 points = 1440 twips = 914,400 EMUs\n * - 1 cm = 0.393701 inches = 360,000 EMUs\n * - 1 point = 20 twips = 12,700 EMUs\n */\n\n/**\n * Standard DPI (dots per inch) for screen displays\n */\nexport const STANDARD_DPI = 96;\n\n/**\n * Conversion constants\n */\nexport const UNITS = {\n /** EMUs per inch */\n EMUS_PER_INCH: 914400,\n /** Twips per inch */\n TWIPS_PER_INCH: 1440,\n /** Points per inch */\n POINTS_PER_INCH: 72,\n /** Twips per point */\n TWIPS_PER_POINT: 20,\n /** EMUs per twip */\n EMUS_PER_TWIP: 635,\n /** EMUs per point */\n EMUS_PER_POINT: 12700,\n /** EMUs per centimeter */\n EMUS_PER_CM: 360000,\n /** Inches per centimeter */\n INCHES_PER_CM: 0.393701,\n /** Centimeters per inch */\n CM_PER_INCH: 2.54,\n /** Half-points per point (Word uses half-points for font sizes) */\n HALF_POINTS_PER_POINT: 2,\n} as const;\n\n// ============================================================================\n// Twips Conversions\n// ============================================================================\n\n/**\n * Converts twips to points\n * @param twips Value in twips\n * @returns Value in points\n */\nexport function twipsToPoints(twips: number): number {\n return twips / UNITS.TWIPS_PER_POINT;\n}\n\n/**\n * Converts twips to inches\n * @param twips Value in twips\n * @returns Value in inches\n */\nexport function twipsToInches(twips: number): number {\n return twips / UNITS.TWIPS_PER_INCH;\n}\n\n/**\n * Converts twips to centimeters\n * @param twips Value in twips\n * @returns Value in centimeters\n */\nexport function twipsToCm(twips: number): number {\n return twipsToInches(twips) * UNITS.CM_PER_INCH;\n}\n\n/**\n * Converts twips to EMUs\n * @param twips Value in twips\n * @returns Value in EMUs\n */\nexport function twipsToEmus(twips: number): number {\n return Math.round(twips * UNITS.EMUS_PER_TWIP);\n}\n\n// ============================================================================\n// EMUs Conversions\n// ============================================================================\n\n/**\n * Converts EMUs to twips\n * @param emus Value in EMUs\n * @returns Value in twips\n */\nexport function emusToTwips(emus: number): number {\n return Math.round(emus / UNITS.EMUS_PER_TWIP);\n}\n\n/**\n * Converts EMUs to inches\n * @param emus Value in EMUs\n * @returns Value in inches\n */\nexport function emusToInches(emus: number): number {\n return emus / UNITS.EMUS_PER_INCH;\n}\n\n/**\n * Converts EMUs to centimeters\n * @param emus Value in EMUs\n * @returns Value in centimeters\n */\nexport function emusToCm(emus: number): number {\n return emus / UNITS.EMUS_PER_CM;\n}\n\n/**\n * Converts EMUs to points\n * @param emus Value in EMUs\n * @returns Value in points\n */\nexport function emusToPoints(emus: number): number {\n return emus / UNITS.EMUS_PER_POINT;\n}\n\n/**\n * Converts EMUs to pixels\n * @param emus Value in EMUs\n * @param dpi Dots per inch (default: 96)\n * @returns Value in pixels\n */\nexport function emusToPixels(emus: number, dpi: number = STANDARD_DPI): number {\n return Math.round((emus / UNITS.EMUS_PER_INCH) * dpi);\n}\n\n// ============================================================================\n// Points Conversions\n// ============================================================================\n\n/**\n * Converts points to twips\n * @param points Value in points\n * @returns Value in twips\n */\nexport function pointsToTwips(points: number): number {\n return points * UNITS.TWIPS_PER_POINT;\n}\n\n/**\n * Converts points to EMUs\n * @param points Value in points\n * @returns Value in EMUs\n */\nexport function pointsToEmus(points: number): number {\n return Math.round(points * UNITS.EMUS_PER_POINT);\n}\n\n/**\n * Converts points to inches\n * @param points Value in points\n * @returns Value in inches\n */\nexport function pointsToInches(points: number): number {\n return points / UNITS.POINTS_PER_INCH;\n}\n\n/**\n * Converts points to centimeters\n * @param points Value in points\n * @returns Value in centimeters\n */\nexport function pointsToCm(points: number): number {\n return pointsToInches(points) * UNITS.CM_PER_INCH;\n}\n\n// ============================================================================\n// Half-Points Conversions (Word uses half-points for font sizes)\n// ============================================================================\n\n/**\n * Converts points to half-points (for Word font size storage)\n * @param points Value in points\n * @returns Value in half-points\n */\nexport function pointsToHalfPoints(points: number): number {\n // Round to nearest integer — w:sz/w:szCs require ST_HpsMeasure (unsigned integer)\n return Math.round(points * UNITS.HALF_POINTS_PER_POINT);\n}\n\n/**\n * Converts half-points to points (from Word font size storage)\n * @param halfPoints Value in half-points\n * @returns Value in points\n */\nexport function halfPointsToPoints(halfPoints: number): number {\n return halfPoints / UNITS.HALF_POINTS_PER_POINT;\n}\n\n// ============================================================================\n// Inches Conversions\n// ============================================================================\n\n/**\n * Converts inches to twips\n * @param inches Value in inches\n * @returns Value in twips\n */\nexport function inchesToTwips(inches: number): number {\n return Math.round(inches * UNITS.TWIPS_PER_INCH);\n}\n\n/**\n * Converts inches to EMUs\n * @param inches Value in inches\n * @returns Value in EMUs\n */\nexport function inchesToEmus(inches: number): number {\n return Math.round(inches * UNITS.EMUS_PER_INCH);\n}\n\n/**\n * Converts inches to points\n * @param inches Value in inches\n * @returns Value in points\n */\nexport function inchesToPoints(inches: number): number {\n return inches * UNITS.POINTS_PER_INCH;\n}\n\n/**\n * Converts inches to centimeters\n * @param inches Value in inches\n * @returns Value in centimeters\n */\nexport function inchesToCm(inches: number): number {\n return inches * UNITS.CM_PER_INCH;\n}\n\n/**\n * Converts inches to pixels\n * @param inches Value in inches\n * @param dpi Dots per inch (default: 96)\n * @returns Value in pixels\n */\nexport function inchesToPixels(inches: number, dpi: number = STANDARD_DPI): number {\n return Math.round(inches * dpi);\n}\n\n// ============================================================================\n// Centimeters Conversions\n// ============================================================================\n\n/**\n * Converts centimeters to twips\n * @param cm Value in centimeters\n * @returns Value in twips\n */\nexport function cmToTwips(cm: number): number {\n return inchesToTwips(cm * UNITS.INCHES_PER_CM);\n}\n\n/**\n * Converts centimeters to EMUs\n * @param cm Value in centimeters\n * @returns Value in EMUs\n */\nexport function cmToEmus(cm: number): number {\n return Math.round(cm * UNITS.EMUS_PER_CM);\n}\n\n/**\n * Converts centimeters to inches\n * @param cm Value in centimeters\n * @returns Value in inches\n */\nexport function cmToInches(cm: number): number {\n return cm * UNITS.INCHES_PER_CM;\n}\n\n/**\n * Converts centimeters to points\n * @param cm Value in centimeters\n * @returns Value in points\n */\nexport function cmToPoints(cm: number): number {\n return inchesToPoints(cmToInches(cm));\n}\n\n/**\n * Converts centimeters to pixels\n * @param cm Value in centimeters\n * @param dpi Dots per inch (default: 96)\n * @returns Value in pixels\n */\nexport function cmToPixels(cm: number, dpi: number = STANDARD_DPI): number {\n return inchesToPixels(cmToInches(cm), dpi);\n}\n\n// ============================================================================\n// Pixels Conversions\n// ============================================================================\n\n/**\n * Converts pixels to EMUs\n * @param pixels Value in pixels\n * @param dpi Dots per inch (default: 96)\n * @returns Value in EMUs\n */\nexport function pixelsToEmus(pixels: number, dpi: number = STANDARD_DPI): number {\n return Math.round((pixels / dpi) * UNITS.EMUS_PER_INCH);\n}\n\n/**\n * Converts pixels to inches\n * @param pixels Value in pixels\n * @param dpi Dots per inch (default: 96)\n * @returns Value in inches\n */\nexport function pixelsToInches(pixels: number, dpi: number = STANDARD_DPI): number {\n return pixels / dpi;\n}\n\n/**\n * Converts pixels to twips\n * @param pixels Value in pixels\n * @param dpi Dots per inch (default: 96)\n * @returns Value in twips\n */\nexport function pixelsToTwips(pixels: number, dpi: number = STANDARD_DPI): number {\n return inchesToTwips(pixelsToInches(pixels, dpi));\n}\n\n/**\n * Converts pixels to centimeters\n * @param pixels Value in pixels\n * @param dpi Dots per inch (default: 96)\n * @returns Value in centimeters\n */\nexport function pixelsToCm(pixels: number, dpi: number = STANDARD_DPI): number {\n return pixelsToInches(pixels, dpi) * UNITS.CM_PER_INCH;\n}\n\n/**\n * Converts pixels to points\n * @param pixels Value in pixels\n * @param dpi Dots per inch (default: 96)\n * @returns Value in points\n */\nexport function pixelsToPoints(pixels: number, dpi: number = STANDARD_DPI): number {\n return inchesToPoints(pixelsToInches(pixels, dpi));\n}\n\n// ============================================================================\n// Common Document Sizes (in twips)\n// ============================================================================\n\n/**\n * Common page sizes in twips\n */\nexport const PAGE_SIZES = {\n /** Letter (8.5\" x 11\") */\n LETTER: {\n width: 12240, // 8.5 inches\n height: 15840, // 11 inches\n },\n /** A4 (21cm x 29.7cm) */\n A4: {\n width: 11906, // 21cm\n height: 16838, // 29.7cm\n },\n /** Legal (8.5\" x 14\") */\n LEGAL: {\n width: 12240, // 8.5 inches\n height: 20160, // 14 inches\n },\n /** Tabloid (11\" x 17\") */\n TABLOID: {\n width: 15840, // 11 inches\n height: 24480, // 17 inches\n },\n /** A3 (29.7cm x 42cm) */\n A3: {\n width: 16838, // 29.7cm\n height: 23811, // 42cm\n },\n} as const;\n\n/**\n * Common margin sizes in twips\n */\nexport const COMMON_MARGINS = {\n /** Normal margins (1 inch all around) */\n NORMAL: {\n top: 1440,\n bottom: 1440,\n left: 1440,\n right: 1440,\n },\n /** Narrow margins (0.5 inch all around) */\n NARROW: {\n top: 720,\n bottom: 720,\n left: 720,\n right: 720,\n },\n /** Wide margins (2 inches left/right, 1 inch top/bottom) */\n WIDE: {\n top: 1440,\n bottom: 1440,\n left: 2880,\n right: 2880,\n },\n /** Moderate margins (1 inch top/bottom, 0.75 inch left/right) */\n MODERATE: {\n top: 1440,\n bottom: 1440,\n left: 1080,\n right: 1080,\n },\n} as const;\n"]}
@@ -1,5 +1,6 @@
1
1
  import type { Document } from '../core/Document';
2
2
  import type { Revision } from '../elements/Revision';
3
+ import type { RevisionManager } from '../elements/RevisionManager';
3
4
  import { AutoFixOptions, AutoFixResult, FixAction } from './ValidationRules';
4
5
  export declare class RevisionAutoFixer {
5
6
  static fix(doc: Document, options?: AutoFixOptions): AutoFixResult;
@@ -10,7 +11,7 @@ export declare class RevisionAutoFixer {
10
11
  static fixOrphanedMoveMarkers(revisionManager: {
11
12
  removeById(id: number): boolean;
12
13
  }, revisions: Revision[], dryRun?: boolean): FixAction[];
13
- static fixEmptyRevisions(revisionManager: any, revisions: Revision[], dryRun?: boolean): FixAction[];
14
+ static fixEmptyRevisions(revisionManager: RevisionManager, revisions: Revision[], dryRun?: boolean): FixAction[];
14
15
  static fixNonSequentialIds(revisions: Revision[], dryRun?: boolean): FixAction[];
15
16
  static preview(doc: Document, options?: Omit<AutoFixOptions, 'dryRun'>): AutoFixResult;
16
17
  static formatResult(result: AutoFixResult): string;
@@ -1 +1 @@
1
- {"version":3,"file":"RevisionAutoFixer.d.ts","sourceRoot":"","sources":["../../src/validation/RevisionAutoFixer.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAEL,cAAc,EACd,aAAa,EACb,SAAS,EAEV,MAAM,mBAAmB,CAAC;AAmB3B,qBAAa,iBAAiB;IAQ5B,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,aAAa;IA8FlE,MAAM,CAAC,eAAe,CAAC,SAAS,EAAE,QAAQ,EAAE,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,SAAS,EAAE;IA4C5E,MAAM,CAAC,iBAAiB,CACtB,SAAS,EAAE,QAAQ,EAAE,EACrB,aAAa,EAAE,MAAM,EACrB,MAAM,CAAC,EAAE,OAAO,GACf,SAAS,EAAE;IAuCd,MAAM,CAAC,eAAe,CAAC,SAAS,EAAE,QAAQ,EAAE,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,SAAS,EAAE;IAwC5E,MAAM,CAAC,eAAe,CAAC,SAAS,EAAE,QAAQ,EAAE,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,SAAS,EAAE;IAyC5E,MAAM,CAAC,sBAAsB,CAC3B,eAAe,EAAE;QAAE,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,EACpD,SAAS,EAAE,QAAQ,EAAE,EACrB,MAAM,CAAC,EAAE,OAAO,GACf,SAAS,EAAE;IA8Ed,MAAM,CAAC,iBAAiB,CACtB,eAAe,EAAE,GAAG,EACpB,SAAS,EAAE,QAAQ,EAAE,EACrB,MAAM,CAAC,EAAE,OAAO,GACf,SAAS,EAAE;IA0Dd,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,QAAQ,EAAE,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,SAAS,EAAE;IAyDhF,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE,IAAI,CAAC,cAAc,EAAE,QAAQ,CAAC,GAAG,aAAa;IAUtF,MAAM,CAAC,YAAY,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM;CAuBnD"}
1
+ {"version":3,"file":"RevisionAutoFixer.d.ts","sourceRoot":"","sources":["../../src/validation/RevisionAutoFixer.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAEL,cAAc,EACd,aAAa,EACb,SAAS,EAEV,MAAM,mBAAmB,CAAC;AAmB3B,qBAAa,iBAAiB;IAQ5B,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,aAAa;IA8FlE,MAAM,CAAC,eAAe,CAAC,SAAS,EAAE,QAAQ,EAAE,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,SAAS,EAAE;IA4C5E,MAAM,CAAC,iBAAiB,CACtB,SAAS,EAAE,QAAQ,EAAE,EACrB,aAAa,EAAE,MAAM,EACrB,MAAM,CAAC,EAAE,OAAO,GACf,SAAS,EAAE;IAuCd,MAAM,CAAC,eAAe,CAAC,SAAS,EAAE,QAAQ,EAAE,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,SAAS,EAAE;IAwC5E,MAAM,CAAC,eAAe,CAAC,SAAS,EAAE,QAAQ,EAAE,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,SAAS,EAAE;IAyC5E,MAAM,CAAC,sBAAsB,CAC3B,eAAe,EAAE;QAAE,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,EACpD,SAAS,EAAE,QAAQ,EAAE,EACrB,MAAM,CAAC,EAAE,OAAO,GACf,SAAS,EAAE;IA8Ed,MAAM,CAAC,iBAAiB,CACtB,eAAe,EAAE,eAAe,EAChC,SAAS,EAAE,QAAQ,EAAE,EACrB,MAAM,CAAC,EAAE,OAAO,GACf,SAAS,EAAE;IA0Dd,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,QAAQ,EAAE,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,SAAS,EAAE;IAyDhF,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE,IAAI,CAAC,cAAc,EAAE,QAAQ,CAAC,GAAG,aAAa;IAUtF,MAAM,CAAC,YAAY,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM;CAuBnD"}
@@ -1 +1 @@
1
- {"version":3,"file":"RevisionAutoFixer.js","sourceRoot":"","sources":["../../src/validation/RevisionAutoFixer.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * RevisionAutoFixer - Automatically fixes revision validation issues\n *\n * Provides auto-fix capabilities for common revision compliance issues,\n * helping to prevent document corruption while preserving user intent.\n *\n * @module RevisionAutoFixer\n */\n\nimport type { Document } from '../core/Document';\nimport type { Revision } from '../elements/Revision';\nimport {\n REVISION_RULES,\n AutoFixOptions,\n AutoFixResult,\n FixAction,\n ValidationIssue,\n} from './ValidationRules';\nimport { RevisionValidator } from './RevisionValidator';\n\n/**\n * Automatically fixes revision validation issues.\n *\n * @example\n * ```typescript\n * // Auto-fix all issues\n * const result = RevisionAutoFixer.fix(doc);\n * console.log(`Fixed ${result.issuesFixed} issues`);\n *\n * // Dry run (preview fixes without applying)\n * const preview = RevisionAutoFixer.fix(doc, { dryRun: true });\n * for (const action of preview.actions) {\n * console.log(`Would fix: ${action.action}`);\n * }\n * ```\n */\nexport class RevisionAutoFixer {\n /**\n * Auto-fix all fixable issues in a document.\n *\n * @param doc - Document to fix\n * @param options - Fix options\n * @returns Result with details of all fixes applied\n */\n static fix(doc: Document, options?: AutoFixOptions): AutoFixResult {\n const actions: FixAction[] = [];\n const errors: string[] = [];\n const revisionManager = doc.getRevisionManager();\n\n if (!revisionManager) {\n return {\n allFixed: true,\n issuesFixed: 0,\n issuesRemaining: 0,\n actions: [],\n errors: [],\n };\n }\n\n const revisions = revisionManager.getAllRevisions();\n const skipRules = new Set(options?.skipRules || []);\n const onlyRules = options?.onlyRules ? new Set(options.onlyRules) : null;\n\n // Helper to check if a rule should be processed\n const shouldProcess = (ruleCode: string) => {\n if (skipRules.has(ruleCode)) return false;\n if (onlyRules && !onlyRules.has(ruleCode)) return false;\n return true;\n };\n\n try {\n // Fix duplicate IDs (REV001)\n if (shouldProcess('REV001')) {\n actions.push(...this.fixDuplicateIds(revisions, options?.dryRun));\n }\n\n // Fix missing authors (REV002)\n if (shouldProcess('REV002')) {\n const defaultAuthor = options?.defaultAuthor || 'Unknown Author';\n actions.push(...this.fixMissingAuthors(revisions, defaultAuthor, options?.dryRun));\n }\n\n // Fix orphaned move markers (REV003, REV004)\n if (shouldProcess('REV003') || shouldProcess('REV004')) {\n actions.push(...this.fixOrphanedMoveMarkers(revisionManager, revisions, options?.dryRun));\n }\n\n // Fix missing dates (REV101)\n if (shouldProcess('REV101')) {\n actions.push(...this.fixMissingDates(revisions, options?.dryRun));\n }\n\n // Fix invalid dates (REV102)\n if (shouldProcess('REV102')) {\n actions.push(...this.fixInvalidDates(revisions, options?.dryRun));\n }\n\n // Fix empty revisions (REV103)\n if (shouldProcess('REV103')) {\n actions.push(...this.fixEmptyRevisions(revisionManager, revisions, options?.dryRun));\n }\n\n // Fix non-sequential IDs (REV104)\n if (shouldProcess('REV104')) {\n actions.push(...this.fixNonSequentialIds(revisions, options?.dryRun));\n }\n } catch (error: unknown) {\n errors.push(`Fix error: ${error instanceof Error ? error.message : String(error)}`);\n }\n\n // Validate after fixes\n const postValidation = RevisionValidator.validate(doc);\n\n // Log actions if verbose\n if (options?.verbose) {\n for (const action of actions) {\n console.log(`[AutoFix] ${action.action}: ${action.issue.code}`);\n }\n }\n\n return {\n allFixed: postValidation.valid,\n issuesFixed: actions.filter((a) => a.success).length,\n issuesRemaining: postValidation.summary.errorCount + postValidation.summary.warningCount,\n actions,\n errors,\n };\n }\n\n /**\n * Fix duplicate revision IDs by reassigning.\n *\n * Assigns new unique IDs to revisions with duplicate IDs.\n *\n * @param revisions - Array of revisions\n * @param dryRun - If true, only report changes without applying\n * @returns Array of fix actions\n */\n static fixDuplicateIds(revisions: Revision[], dryRun?: boolean): FixAction[] {\n const actions: FixAction[] = [];\n const usedIds = new Set<number>();\n let nextId = Math.max(...revisions.map((r) => r.getId()), 0) + 1;\n\n for (const rev of revisions) {\n const id = rev.getId();\n\n if (usedIds.has(id)) {\n const newId = nextId++;\n const issue: ValidationIssue = {\n code: REVISION_RULES.DUPLICATE_ID.code,\n severity: 'error',\n message: `Duplicate ID ${id}`,\n location: { revisionId: id },\n autoFixable: true,\n };\n\n actions.push({\n issue,\n action: `Reassigned duplicate ID ${id} to ${newId}`,\n before: id,\n after: newId,\n success: true,\n });\n\n if (!dryRun) {\n rev.setId(newId);\n }\n }\n usedIds.add(rev.getId());\n }\n\n return actions;\n }\n\n /**\n * Fix missing authors by setting a default value.\n *\n * @param revisions - Array of revisions\n * @param defaultAuthor - Default author name to use\n * @param dryRun - If true, only report changes without applying\n * @returns Array of fix actions\n */\n static fixMissingAuthors(\n revisions: Revision[],\n defaultAuthor: string,\n dryRun?: boolean\n ): FixAction[] {\n const actions: FixAction[] = [];\n\n for (const rev of revisions) {\n const author = rev.getAuthor();\n\n if (!author || author.trim() === '') {\n const issue: ValidationIssue = {\n code: REVISION_RULES.MISSING_AUTHOR.code,\n severity: 'error',\n message: `Missing author for revision ${rev.getId()}`,\n location: { revisionId: rev.getId() },\n autoFixable: true,\n };\n\n actions.push({\n issue,\n action: `Set author to \"${defaultAuthor}\" for revision ${rev.getId()}`,\n before: author,\n after: defaultAuthor,\n success: true,\n });\n\n if (!dryRun) {\n rev.setAuthor(defaultAuthor);\n }\n }\n }\n\n return actions;\n }\n\n /**\n * Fix missing dates by setting current date.\n *\n * @param revisions - Array of revisions\n * @param dryRun - If true, only report changes without applying\n * @returns Array of fix actions\n */\n static fixMissingDates(revisions: Revision[], dryRun?: boolean): FixAction[] {\n const actions: FixAction[] = [];\n const now = new Date();\n\n for (const rev of revisions) {\n const date = rev.getDate();\n\n if (!date) {\n const issue: ValidationIssue = {\n code: REVISION_RULES.MISSING_DATE.code,\n severity: 'warning',\n message: `Missing date for revision ${rev.getId()}`,\n location: { revisionId: rev.getId() },\n autoFixable: true,\n };\n\n actions.push({\n issue,\n action: `Set date to ${now.toISOString()} for revision ${rev.getId()}`,\n before: null,\n after: now,\n success: true,\n });\n\n if (!dryRun) {\n rev.setDate(now);\n }\n }\n }\n\n return actions;\n }\n\n /**\n * Fix invalid dates by replacing with current date.\n *\n * @param revisions - Array of revisions\n * @param dryRun - If true, only report changes without applying\n * @returns Array of fix actions\n */\n static fixInvalidDates(revisions: Revision[], dryRun?: boolean): FixAction[] {\n const actions: FixAction[] = [];\n const now = new Date();\n\n for (const rev of revisions) {\n const date = rev.getDate();\n\n if (date && isNaN(date.getTime())) {\n const issue: ValidationIssue = {\n code: REVISION_RULES.INVALID_DATE_FORMAT.code,\n severity: 'warning',\n message: `Invalid date for revision ${rev.getId()}`,\n location: { revisionId: rev.getId() },\n autoFixable: true,\n };\n\n actions.push({\n issue,\n action: `Replaced invalid date with ${now.toISOString()} for revision ${rev.getId()}`,\n before: date,\n after: now,\n success: true,\n });\n\n if (!dryRun) {\n rev.setDate(now);\n }\n }\n }\n\n return actions;\n }\n\n /**\n * Fix orphaned move markers by removing them.\n *\n * @param revisionManager - RevisionManager instance\n * @param revisions - Array of revisions\n * @param dryRun - If true, only report changes without applying\n * @returns Array of fix actions\n */\n static fixOrphanedMoveMarkers(\n revisionManager: { removeById(id: number): boolean },\n revisions: Revision[],\n dryRun?: boolean\n ): FixAction[] {\n const actions: FixAction[] = [];\n\n const moveFromIds = new Map<string, Revision>();\n const moveToIds = new Map<string, Revision>();\n\n for (const rev of revisions) {\n const moveId = rev.getMoveId();\n if (!moveId) continue;\n\n if (rev.getType() === 'moveFrom') {\n moveFromIds.set(moveId, rev);\n } else if (rev.getType() === 'moveTo') {\n moveToIds.set(moveId, rev);\n }\n }\n\n // Remove orphaned moveFrom\n for (const [moveId, rev] of moveFromIds) {\n if (!moveToIds.has(moveId)) {\n const issue: ValidationIssue = {\n code: REVISION_RULES.ORPHANED_MOVE_FROM.code,\n severity: 'error',\n message: `Orphaned moveFrom with moveId=\"${moveId}\"`,\n location: { revisionId: rev.getId() },\n autoFixable: true,\n };\n\n actions.push({\n issue,\n action: `Removed orphaned moveFrom (ID: ${rev.getId()}, moveId: ${moveId})`,\n before: { type: 'moveFrom', moveId },\n after: null,\n success: true,\n });\n\n if (!dryRun) {\n revisionManager.removeById(rev.getId());\n }\n }\n }\n\n // Remove orphaned moveTo\n for (const [moveId, rev] of moveToIds) {\n if (!moveFromIds.has(moveId)) {\n const issue: ValidationIssue = {\n code: REVISION_RULES.ORPHANED_MOVE_TO.code,\n severity: 'error',\n message: `Orphaned moveTo with moveId=\"${moveId}\"`,\n location: { revisionId: rev.getId() },\n autoFixable: true,\n };\n\n actions.push({\n issue,\n action: `Removed orphaned moveTo (ID: ${rev.getId()}, moveId: ${moveId})`,\n before: { type: 'moveTo', moveId },\n after: null,\n success: true,\n });\n\n if (!dryRun) {\n revisionManager.removeById(rev.getId());\n }\n }\n }\n\n return actions;\n }\n\n /**\n * Fix empty revisions by removing them.\n *\n * @param revisionManager - RevisionManager instance\n * @param revisions - Array of revisions\n * @param dryRun - If true, only report changes without applying\n * @returns Array of fix actions\n */\n static fixEmptyRevisions(\n revisionManager: any,\n revisions: Revision[],\n dryRun?: boolean\n ): FixAction[] {\n const actions: FixAction[] = [];\n\n const propertyChangeTypes = [\n 'runPropertiesChange',\n 'paragraphPropertiesChange',\n 'tablePropertiesChange',\n 'tableExceptionPropertiesChange',\n 'tableRowPropertiesChange',\n 'tableCellPropertiesChange',\n 'sectionPropertiesChange',\n 'numberingChange',\n ];\n\n for (const rev of revisions) {\n const type = rev.getType();\n\n // Skip property changes\n if (propertyChangeTypes.includes(type)) {\n continue;\n }\n\n const runs = rev.getRuns();\n const hasContent = runs.length > 0 && runs.some((r) => r.getText().length > 0);\n\n if (!hasContent) {\n const issue: ValidationIssue = {\n code: REVISION_RULES.EMPTY_REVISION.code,\n severity: 'warning',\n message: `Empty revision ${rev.getId()} (type: ${type})`,\n location: { revisionId: rev.getId() },\n autoFixable: true,\n };\n\n actions.push({\n issue,\n action: `Removed empty revision (ID: ${rev.getId()}, type: ${type})`,\n before: { id: rev.getId(), type },\n after: null,\n success: true,\n });\n\n if (!dryRun) {\n revisionManager.removeById(rev.getId());\n }\n }\n }\n\n return actions;\n }\n\n /**\n * Fix non-sequential IDs by reassigning.\n *\n * @param revisions - Array of revisions\n * @param dryRun - If true, only report changes without applying\n * @returns Array of fix actions\n */\n static fixNonSequentialIds(revisions: Revision[], dryRun?: boolean): FixAction[] {\n const actions: FixAction[] = [];\n\n if (revisions.length === 0) return actions;\n\n // Check if IDs are already sequential\n const ids = revisions.map((r) => r.getId()).sort((a, b) => a - b);\n let isSequential = true;\n\n for (let i = 1; i < ids.length; i++) {\n const currentId = ids[i]!;\n const prevId = ids[i - 1]!;\n if (currentId !== prevId + 1) {\n isSequential = false;\n break;\n }\n }\n\n if (!isSequential) {\n const issue: ValidationIssue = {\n code: REVISION_RULES.NON_SEQUENTIAL_IDS.code,\n severity: 'warning',\n message: 'Revision IDs are not sequential',\n autoFixable: true,\n };\n\n const oldIds = revisions.map((r) => r.getId());\n const newIds: number[] = [];\n\n revisions.forEach((rev, index) => {\n newIds.push(index);\n if (!dryRun) {\n rev.setId(index);\n }\n });\n\n actions.push({\n issue,\n action: `Reassigned ${revisions.length} revision IDs to be sequential (0 to ${revisions.length - 1})`,\n before: oldIds,\n after: newIds,\n success: true,\n });\n }\n\n return actions;\n }\n\n /**\n * Preview fixes without applying them.\n *\n * Convenience method that calls fix() with dryRun: true.\n *\n * @param doc - Document to preview fixes for\n * @param options - Fix options (dryRun is forced to true)\n * @returns Result showing what would be fixed\n */\n static preview(doc: Document, options?: Omit<AutoFixOptions, 'dryRun'>): AutoFixResult {\n return this.fix(doc, { ...options, dryRun: true });\n }\n\n /**\n * Format fix result as a human-readable string.\n *\n * @param result - AutoFixResult to format\n * @returns Formatted string\n */\n static formatResult(result: AutoFixResult): string {\n const lines: string[] = [];\n\n lines.push(`Auto-Fix ${result.allFixed ? 'COMPLETE' : 'PARTIAL'}`);\n lines.push(`Fixed: ${result.issuesFixed}, Remaining: ${result.issuesRemaining}`);\n\n if (result.actions.length > 0) {\n lines.push('\\nActions taken:');\n for (const action of result.actions) {\n const status = action.success ? 'OK' : 'FAILED';\n lines.push(` [${status}] ${action.action}`);\n }\n }\n\n if (result.errors.length > 0) {\n lines.push('\\nErrors:');\n for (const error of result.errors) {\n lines.push(` - ${error}`);\n }\n }\n\n return lines.join('\\n');\n }\n}\n"]}
1
+ {"version":3,"file":"RevisionAutoFixer.js","sourceRoot":"","sources":["../../src/validation/RevisionAutoFixer.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * RevisionAutoFixer - Automatically fixes revision validation issues\n *\n * Provides auto-fix capabilities for common revision compliance issues,\n * helping to prevent document corruption while preserving user intent.\n *\n * @module RevisionAutoFixer\n */\n\nimport type { Document } from '../core/Document';\nimport type { Revision } from '../elements/Revision';\nimport type { RevisionManager } from '../elements/RevisionManager';\nimport {\n REVISION_RULES,\n AutoFixOptions,\n AutoFixResult,\n FixAction,\n ValidationIssue,\n} from './ValidationRules';\nimport { RevisionValidator } from './RevisionValidator';\n\n/**\n * Automatically fixes revision validation issues.\n *\n * @example\n * ```typescript\n * // Auto-fix all issues\n * const result = RevisionAutoFixer.fix(doc);\n * console.log(`Fixed ${result.issuesFixed} issues`);\n *\n * // Dry run (preview fixes without applying)\n * const preview = RevisionAutoFixer.fix(doc, { dryRun: true });\n * for (const action of preview.actions) {\n * console.log(`Would fix: ${action.action}`);\n * }\n * ```\n */\nexport class RevisionAutoFixer {\n /**\n * Auto-fix all fixable issues in a document.\n *\n * @param doc - Document to fix\n * @param options - Fix options\n * @returns Result with details of all fixes applied\n */\n static fix(doc: Document, options?: AutoFixOptions): AutoFixResult {\n const actions: FixAction[] = [];\n const errors: string[] = [];\n const revisionManager = doc.getRevisionManager();\n\n if (!revisionManager) {\n return {\n allFixed: true,\n issuesFixed: 0,\n issuesRemaining: 0,\n actions: [],\n errors: [],\n };\n }\n\n const revisions = revisionManager.getAllRevisions();\n const skipRules = new Set(options?.skipRules || []);\n const onlyRules = options?.onlyRules ? new Set(options.onlyRules) : null;\n\n // Helper to check if a rule should be processed\n const shouldProcess = (ruleCode: string) => {\n if (skipRules.has(ruleCode)) return false;\n if (onlyRules && !onlyRules.has(ruleCode)) return false;\n return true;\n };\n\n try {\n // Fix duplicate IDs (REV001)\n if (shouldProcess('REV001')) {\n actions.push(...this.fixDuplicateIds(revisions, options?.dryRun));\n }\n\n // Fix missing authors (REV002)\n if (shouldProcess('REV002')) {\n const defaultAuthor = options?.defaultAuthor || 'Unknown Author';\n actions.push(...this.fixMissingAuthors(revisions, defaultAuthor, options?.dryRun));\n }\n\n // Fix orphaned move markers (REV003, REV004)\n if (shouldProcess('REV003') || shouldProcess('REV004')) {\n actions.push(...this.fixOrphanedMoveMarkers(revisionManager, revisions, options?.dryRun));\n }\n\n // Fix missing dates (REV101)\n if (shouldProcess('REV101')) {\n actions.push(...this.fixMissingDates(revisions, options?.dryRun));\n }\n\n // Fix invalid dates (REV102)\n if (shouldProcess('REV102')) {\n actions.push(...this.fixInvalidDates(revisions, options?.dryRun));\n }\n\n // Fix empty revisions (REV103)\n if (shouldProcess('REV103')) {\n actions.push(...this.fixEmptyRevisions(revisionManager, revisions, options?.dryRun));\n }\n\n // Fix non-sequential IDs (REV104)\n if (shouldProcess('REV104')) {\n actions.push(...this.fixNonSequentialIds(revisions, options?.dryRun));\n }\n } catch (error: unknown) {\n errors.push(`Fix error: ${error instanceof Error ? error.message : String(error)}`);\n }\n\n // Validate after fixes\n const postValidation = RevisionValidator.validate(doc);\n\n // Log actions if verbose\n if (options?.verbose) {\n for (const action of actions) {\n console.log(`[AutoFix] ${action.action}: ${action.issue.code}`);\n }\n }\n\n return {\n allFixed: postValidation.valid,\n issuesFixed: actions.filter((a) => a.success).length,\n issuesRemaining: postValidation.summary.errorCount + postValidation.summary.warningCount,\n actions,\n errors,\n };\n }\n\n /**\n * Fix duplicate revision IDs by reassigning.\n *\n * Assigns new unique IDs to revisions with duplicate IDs.\n *\n * @param revisions - Array of revisions\n * @param dryRun - If true, only report changes without applying\n * @returns Array of fix actions\n */\n static fixDuplicateIds(revisions: Revision[], dryRun?: boolean): FixAction[] {\n const actions: FixAction[] = [];\n const usedIds = new Set<number>();\n let nextId = Math.max(...revisions.map((r) => r.getId()), 0) + 1;\n\n for (const rev of revisions) {\n const id = rev.getId();\n\n if (usedIds.has(id)) {\n const newId = nextId++;\n const issue: ValidationIssue = {\n code: REVISION_RULES.DUPLICATE_ID.code,\n severity: 'error',\n message: `Duplicate ID ${id}`,\n location: { revisionId: id },\n autoFixable: true,\n };\n\n actions.push({\n issue,\n action: `Reassigned duplicate ID ${id} to ${newId}`,\n before: id,\n after: newId,\n success: true,\n });\n\n if (!dryRun) {\n rev.setId(newId);\n }\n }\n usedIds.add(rev.getId());\n }\n\n return actions;\n }\n\n /**\n * Fix missing authors by setting a default value.\n *\n * @param revisions - Array of revisions\n * @param defaultAuthor - Default author name to use\n * @param dryRun - If true, only report changes without applying\n * @returns Array of fix actions\n */\n static fixMissingAuthors(\n revisions: Revision[],\n defaultAuthor: string,\n dryRun?: boolean\n ): FixAction[] {\n const actions: FixAction[] = [];\n\n for (const rev of revisions) {\n const author = rev.getAuthor();\n\n if (!author || author.trim() === '') {\n const issue: ValidationIssue = {\n code: REVISION_RULES.MISSING_AUTHOR.code,\n severity: 'error',\n message: `Missing author for revision ${rev.getId()}`,\n location: { revisionId: rev.getId() },\n autoFixable: true,\n };\n\n actions.push({\n issue,\n action: `Set author to \"${defaultAuthor}\" for revision ${rev.getId()}`,\n before: author,\n after: defaultAuthor,\n success: true,\n });\n\n if (!dryRun) {\n rev.setAuthor(defaultAuthor);\n }\n }\n }\n\n return actions;\n }\n\n /**\n * Fix missing dates by setting current date.\n *\n * @param revisions - Array of revisions\n * @param dryRun - If true, only report changes without applying\n * @returns Array of fix actions\n */\n static fixMissingDates(revisions: Revision[], dryRun?: boolean): FixAction[] {\n const actions: FixAction[] = [];\n const now = new Date();\n\n for (const rev of revisions) {\n const date = rev.getDate();\n\n if (!date) {\n const issue: ValidationIssue = {\n code: REVISION_RULES.MISSING_DATE.code,\n severity: 'warning',\n message: `Missing date for revision ${rev.getId()}`,\n location: { revisionId: rev.getId() },\n autoFixable: true,\n };\n\n actions.push({\n issue,\n action: `Set date to ${now.toISOString()} for revision ${rev.getId()}`,\n before: null,\n after: now,\n success: true,\n });\n\n if (!dryRun) {\n rev.setDate(now);\n }\n }\n }\n\n return actions;\n }\n\n /**\n * Fix invalid dates by replacing with current date.\n *\n * @param revisions - Array of revisions\n * @param dryRun - If true, only report changes without applying\n * @returns Array of fix actions\n */\n static fixInvalidDates(revisions: Revision[], dryRun?: boolean): FixAction[] {\n const actions: FixAction[] = [];\n const now = new Date();\n\n for (const rev of revisions) {\n const date = rev.getDate();\n\n if (date && isNaN(date.getTime())) {\n const issue: ValidationIssue = {\n code: REVISION_RULES.INVALID_DATE_FORMAT.code,\n severity: 'warning',\n message: `Invalid date for revision ${rev.getId()}`,\n location: { revisionId: rev.getId() },\n autoFixable: true,\n };\n\n actions.push({\n issue,\n action: `Replaced invalid date with ${now.toISOString()} for revision ${rev.getId()}`,\n before: date,\n after: now,\n success: true,\n });\n\n if (!dryRun) {\n rev.setDate(now);\n }\n }\n }\n\n return actions;\n }\n\n /**\n * Fix orphaned move markers by removing them.\n *\n * @param revisionManager - RevisionManager instance\n * @param revisions - Array of revisions\n * @param dryRun - If true, only report changes without applying\n * @returns Array of fix actions\n */\n static fixOrphanedMoveMarkers(\n revisionManager: { removeById(id: number): boolean },\n revisions: Revision[],\n dryRun?: boolean\n ): FixAction[] {\n const actions: FixAction[] = [];\n\n const moveFromIds = new Map<string, Revision>();\n const moveToIds = new Map<string, Revision>();\n\n for (const rev of revisions) {\n const moveId = rev.getMoveId();\n if (!moveId) continue;\n\n if (rev.getType() === 'moveFrom') {\n moveFromIds.set(moveId, rev);\n } else if (rev.getType() === 'moveTo') {\n moveToIds.set(moveId, rev);\n }\n }\n\n // Remove orphaned moveFrom\n for (const [moveId, rev] of moveFromIds) {\n if (!moveToIds.has(moveId)) {\n const issue: ValidationIssue = {\n code: REVISION_RULES.ORPHANED_MOVE_FROM.code,\n severity: 'error',\n message: `Orphaned moveFrom with moveId=\"${moveId}\"`,\n location: { revisionId: rev.getId() },\n autoFixable: true,\n };\n\n actions.push({\n issue,\n action: `Removed orphaned moveFrom (ID: ${rev.getId()}, moveId: ${moveId})`,\n before: { type: 'moveFrom', moveId },\n after: null,\n success: true,\n });\n\n if (!dryRun) {\n revisionManager.removeById(rev.getId());\n }\n }\n }\n\n // Remove orphaned moveTo\n for (const [moveId, rev] of moveToIds) {\n if (!moveFromIds.has(moveId)) {\n const issue: ValidationIssue = {\n code: REVISION_RULES.ORPHANED_MOVE_TO.code,\n severity: 'error',\n message: `Orphaned moveTo with moveId=\"${moveId}\"`,\n location: { revisionId: rev.getId() },\n autoFixable: true,\n };\n\n actions.push({\n issue,\n action: `Removed orphaned moveTo (ID: ${rev.getId()}, moveId: ${moveId})`,\n before: { type: 'moveTo', moveId },\n after: null,\n success: true,\n });\n\n if (!dryRun) {\n revisionManager.removeById(rev.getId());\n }\n }\n }\n\n return actions;\n }\n\n /**\n * Fix empty revisions by removing them.\n *\n * @param revisionManager - RevisionManager instance\n * @param revisions - Array of revisions\n * @param dryRun - If true, only report changes without applying\n * @returns Array of fix actions\n */\n static fixEmptyRevisions(\n revisionManager: RevisionManager,\n revisions: Revision[],\n dryRun?: boolean\n ): FixAction[] {\n const actions: FixAction[] = [];\n\n const propertyChangeTypes = [\n 'runPropertiesChange',\n 'paragraphPropertiesChange',\n 'tablePropertiesChange',\n 'tableExceptionPropertiesChange',\n 'tableRowPropertiesChange',\n 'tableCellPropertiesChange',\n 'sectionPropertiesChange',\n 'numberingChange',\n ];\n\n for (const rev of revisions) {\n const type = rev.getType();\n\n // Skip property changes\n if (propertyChangeTypes.includes(type)) {\n continue;\n }\n\n const runs = rev.getRuns();\n const hasContent = runs.length > 0 && runs.some((r) => r.getText().length > 0);\n\n if (!hasContent) {\n const issue: ValidationIssue = {\n code: REVISION_RULES.EMPTY_REVISION.code,\n severity: 'warning',\n message: `Empty revision ${rev.getId()} (type: ${type})`,\n location: { revisionId: rev.getId() },\n autoFixable: true,\n };\n\n actions.push({\n issue,\n action: `Removed empty revision (ID: ${rev.getId()}, type: ${type})`,\n before: { id: rev.getId(), type },\n after: null,\n success: true,\n });\n\n if (!dryRun) {\n revisionManager.removeById(rev.getId());\n }\n }\n }\n\n return actions;\n }\n\n /**\n * Fix non-sequential IDs by reassigning.\n *\n * @param revisions - Array of revisions\n * @param dryRun - If true, only report changes without applying\n * @returns Array of fix actions\n */\n static fixNonSequentialIds(revisions: Revision[], dryRun?: boolean): FixAction[] {\n const actions: FixAction[] = [];\n\n if (revisions.length === 0) return actions;\n\n // Check if IDs are already sequential\n const ids = revisions.map((r) => r.getId()).sort((a, b) => a - b);\n let isSequential = true;\n\n for (let i = 1; i < ids.length; i++) {\n const currentId = ids[i]!;\n const prevId = ids[i - 1]!;\n if (currentId !== prevId + 1) {\n isSequential = false;\n break;\n }\n }\n\n if (!isSequential) {\n const issue: ValidationIssue = {\n code: REVISION_RULES.NON_SEQUENTIAL_IDS.code,\n severity: 'warning',\n message: 'Revision IDs are not sequential',\n autoFixable: true,\n };\n\n const oldIds = revisions.map((r) => r.getId());\n const newIds: number[] = [];\n\n revisions.forEach((rev, index) => {\n newIds.push(index);\n if (!dryRun) {\n rev.setId(index);\n }\n });\n\n actions.push({\n issue,\n action: `Reassigned ${revisions.length} revision IDs to be sequential (0 to ${revisions.length - 1})`,\n before: oldIds,\n after: newIds,\n success: true,\n });\n }\n\n return actions;\n }\n\n /**\n * Preview fixes without applying them.\n *\n * Convenience method that calls fix() with dryRun: true.\n *\n * @param doc - Document to preview fixes for\n * @param options - Fix options (dryRun is forced to true)\n * @returns Result showing what would be fixed\n */\n static preview(doc: Document, options?: Omit<AutoFixOptions, 'dryRun'>): AutoFixResult {\n return this.fix(doc, { ...options, dryRun: true });\n }\n\n /**\n * Format fix result as a human-readable string.\n *\n * @param result - AutoFixResult to format\n * @returns Formatted string\n */\n static formatResult(result: AutoFixResult): string {\n const lines: string[] = [];\n\n lines.push(`Auto-Fix ${result.allFixed ? 'COMPLETE' : 'PARTIAL'}`);\n lines.push(`Fixed: ${result.issuesFixed}, Remaining: ${result.issuesRemaining}`);\n\n if (result.actions.length > 0) {\n lines.push('\\nActions taken:');\n for (const action of result.actions) {\n const status = action.success ? 'OK' : 'FAILED';\n lines.push(` [${status}] ${action.action}`);\n }\n }\n\n if (result.errors.length > 0) {\n lines.push('\\nErrors:');\n for (const error of result.errors) {\n lines.push(` - ${error}`);\n }\n }\n\n return lines.join('\\n');\n }\n}\n"]}
package/package.json CHANGED
@@ -1,9 +1,17 @@
1
1
  {
2
2
  "name": "docxmlater",
3
- "version": "10.3.6",
3
+ "version": "10.4.0",
4
4
  "description": "A comprehensive DOCX editing framework for creating, reading, and manipulating Microsoft Word documents",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
7
+ "exports": {
8
+ ".": {
9
+ "types": "./dist/index.d.ts",
10
+ "require": "./dist/index.js",
11
+ "default": "./dist/index.js"
12
+ },
13
+ "./package.json": "./package.json"
14
+ },
7
15
  "scripts": {
8
16
  "build": "tsc",
9
17
  "test": "jest",
@@ -56,6 +64,7 @@
56
64
  "README.md",
57
65
  "LICENSE"
58
66
  ],
67
+ "sideEffects": false,
59
68
  "engines": {
60
69
  "node": ">=18.0.0"
61
70
  },
@@ -0,0 +1,28 @@
1
+ # Constants Module
2
+
3
+ `src/constants/` — Compile-time constants for limits and OOXML compatibility.
4
+
5
+ ## Files
6
+
7
+ ### `limits.ts`
8
+ Document validation and processing thresholds:
9
+
10
+ | Category | Constant | Value | Purpose |
11
+ |----------|----------|-------|---------|
12
+ | Property | `MAX_STRING_LENGTH` | 10,000 | Max string property length |
13
+ | Property | `MAX_REVISION` | 999,999 | Max revision ID |
14
+ | File size | `WARNING_SIZE_MB` | 50 | Log warning above this |
15
+ | File size | `ERROR_SIZE_MB` | 150 | Reject above this |
16
+ | XML | `MAX_PARSE_SIZE_MB` | 10 | Per-part parse limit |
17
+ | Memory | `DEFAULT_MAX_HEAP_PERCENT` | 80% | Heap usage threshold |
18
+ | Memory | `DEFAULT_MAX_RSS_MB` | 2,048 | RSS limit |
19
+ | Images | `DEFAULT_MAX_IMAGE_COUNT` | 20 | Max images per doc |
20
+ | Images | `DEFAULT_MAX_TOTAL_SIZE_MB` | 100 | Total image data limit |
21
+
22
+ ### `legacyCompatFlags.ts`
23
+ ECMA-376 compatibility mode constants:
24
+
25
+ - `LEGACY_COMPAT_ELEMENTS` — 65 boolean flags from CT_Compat (1st edition). Used by `CompatibilityUpgrader` to remove legacy flags during upgrade.
26
+ - `MODERN_COMPAT_SETTINGS` — 5 `compatSetting` entries for Word 2013+ mode (differenceMultilineTableBorder, overrideTableStyleFontSizeAndJustification, enableOpenTypeFeatures, etc.)
27
+ - `useWord2013TrackBottomHyphenation` intentionally omitted (value varies across Word versions)
28
+ - Custom URI compat settings are preserved during upgrade (only Microsoft URI settings replaced)
@@ -31,6 +31,10 @@ Converts XML to JavaScript object models. Position-based parsing (ReDoS-safe).
31
31
  - Form field data: `parseFormFieldData()` with typed interfaces
32
32
  - Footnotes/endnotes: `parseFootnotesXml()`/`parseEndnotesXml()`
33
33
  - Unknown elements preserved for round-trip fidelity
34
+ - CT_OnOff parsing: uses `parseOoxmlBoolean()` with `!== undefined` checks to preserve explicit `val="0"` for style override semantics
35
+ - `w:color w:val="auto"` preserved on round-trip (bypasses `normalizeColor()` hex validation)
36
+ - `w14:paraId`/`w14:textId` parsed from paragraph elements and auto-generated for new paragraphs
37
+ - `w:trHeight w:hRule` absent = omit (spec default "auto"), not defaulted to "atLeast"
34
38
 
35
39
  ### DocumentGenerator (`DocumentGenerator.ts`)
36
40