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.
- package/README.md +158 -7
- package/dist/core/Document.d.ts +97 -3
- package/dist/core/Document.d.ts.map +1 -1
- package/dist/core/Document.js +727 -50
- package/dist/core/Document.js.map +1 -1
- package/dist/core/DocumentContent.d.ts.map +1 -1
- package/dist/core/DocumentContent.js +0 -8
- package/dist/core/DocumentContent.js.map +1 -1
- package/dist/core/DocumentGenerator.d.ts.map +1 -1
- package/dist/core/DocumentGenerator.js +9 -5
- package/dist/core/DocumentGenerator.js.map +1 -1
- package/dist/core/DocumentParser.d.ts.map +1 -1
- package/dist/core/DocumentParser.js +573 -101
- package/dist/core/DocumentParser.js.map +1 -1
- package/dist/core/RelationshipManager.d.ts.map +1 -1
- package/dist/core/RelationshipManager.js +4 -3
- package/dist/core/RelationshipManager.js.map +1 -1
- package/dist/elements/Bookmark.d.ts +7 -0
- package/dist/elements/Bookmark.d.ts.map +1 -1
- package/dist/elements/Bookmark.js +24 -4
- package/dist/elements/Bookmark.js.map +1 -1
- package/dist/elements/BookmarkManager.d.ts.map +1 -1
- package/dist/elements/BookmarkManager.js +4 -3
- package/dist/elements/BookmarkManager.js.map +1 -1
- package/dist/elements/CommonTypes.d.ts +2 -2
- package/dist/elements/CommonTypes.d.ts.map +1 -1
- package/dist/elements/CommonTypes.js +14 -1
- package/dist/elements/CommonTypes.js.map +1 -1
- package/dist/elements/Field.d.ts +1 -1
- package/dist/elements/Field.d.ts.map +1 -1
- package/dist/elements/Field.js +1 -1
- package/dist/elements/Field.js.map +1 -1
- package/dist/elements/Footer.d.ts +2 -0
- package/dist/elements/Footer.d.ts.map +1 -1
- package/dist/elements/Footer.js +6 -0
- package/dist/elements/Footer.js.map +1 -1
- package/dist/elements/Header.d.ts +2 -0
- package/dist/elements/Header.d.ts.map +1 -1
- package/dist/elements/Header.js +6 -0
- package/dist/elements/Header.js.map +1 -1
- package/dist/elements/Image.d.ts.map +1 -1
- package/dist/elements/Image.js +3 -0
- package/dist/elements/Image.js.map +1 -1
- package/dist/elements/Paragraph.d.ts +81 -1
- package/dist/elements/Paragraph.d.ts.map +1 -1
- package/dist/elements/Paragraph.js +515 -21
- package/dist/elements/Paragraph.js.map +1 -1
- package/dist/elements/Revision.d.ts +0 -1
- package/dist/elements/Revision.d.ts.map +1 -1
- package/dist/elements/Revision.js +0 -12
- package/dist/elements/Revision.js.map +1 -1
- package/dist/elements/RevisionManager.d.ts +0 -1
- package/dist/elements/RevisionManager.d.ts.map +1 -1
- package/dist/elements/RevisionManager.js +0 -2
- package/dist/elements/RevisionManager.js.map +1 -1
- package/dist/elements/Run.d.ts +16 -4
- package/dist/elements/Run.d.ts.map +1 -1
- package/dist/elements/Run.js +114 -22
- package/dist/elements/Run.js.map +1 -1
- package/dist/elements/Section.d.ts +7 -1
- package/dist/elements/Section.d.ts.map +1 -1
- package/dist/elements/Section.js +185 -4
- package/dist/elements/Section.js.map +1 -1
- package/dist/elements/Shape.js.map +1 -1
- package/dist/elements/Table.d.ts +30 -1
- package/dist/elements/Table.d.ts.map +1 -1
- package/dist/elements/Table.js +357 -40
- package/dist/elements/Table.js.map +1 -1
- package/dist/elements/TableCell.d.ts +3 -0
- package/dist/elements/TableCell.d.ts.map +1 -1
- package/dist/elements/TableCell.js +30 -3
- package/dist/elements/TableCell.js.map +1 -1
- package/dist/elements/TableGridChange.d.ts +0 -1
- package/dist/elements/TableGridChange.d.ts.map +1 -1
- package/dist/elements/TableGridChange.js +0 -10
- package/dist/elements/TableGridChange.js.map +1 -1
- package/dist/elements/TableRow.d.ts +4 -0
- package/dist/elements/TableRow.d.ts.map +1 -1
- package/dist/elements/TableRow.js +31 -3
- package/dist/elements/TableRow.js.map +1 -1
- package/dist/formatting/AbstractNumbering.d.ts +5 -0
- package/dist/formatting/AbstractNumbering.d.ts.map +1 -1
- package/dist/formatting/AbstractNumbering.js +22 -0
- package/dist/formatting/AbstractNumbering.js.map +1 -1
- package/dist/formatting/NumberingLevel.d.ts.map +1 -1
- package/dist/formatting/NumberingLevel.js +3 -3
- package/dist/formatting/NumberingLevel.js.map +1 -1
- package/dist/formatting/Style.d.ts +1 -0
- package/dist/formatting/Style.d.ts.map +1 -1
- package/dist/formatting/Style.js +25 -59
- package/dist/formatting/Style.js.map +1 -1
- package/dist/formatting/StylesManager.d.ts +1 -0
- package/dist/formatting/StylesManager.d.ts.map +1 -1
- package/dist/formatting/StylesManager.js +12 -0
- package/dist/formatting/StylesManager.js.map +1 -1
- package/dist/helpers/CleanupHelper.js.map +1 -1
- package/dist/images/ImageOptimizer.d.ts.map +1 -1
- package/dist/images/ImageOptimizer.js +0 -1
- package/dist/images/ImageOptimizer.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/managers/DrawingManager.d.ts.map +1 -1
- package/dist/managers/DrawingManager.js +4 -2
- package/dist/managers/DrawingManager.js.map +1 -1
- package/dist/types/formatting.d.ts +2 -2
- package/dist/types/formatting.d.ts.map +1 -1
- package/dist/types/formatting.js.map +1 -1
- package/dist/utils/ChangelogGenerator.d.ts +2 -2
- package/dist/utils/ChangelogGenerator.d.ts.map +1 -1
- package/dist/utils/ChangelogGenerator.js +4 -5
- package/dist/utils/ChangelogGenerator.js.map +1 -1
- package/dist/utils/InMemoryRevisionAcceptor.d.ts.map +1 -1
- package/dist/utils/InMemoryRevisionAcceptor.js +0 -1
- package/dist/utils/InMemoryRevisionAcceptor.js.map +1 -1
- package/dist/utils/RevisionAwareProcessor.d.ts +2 -2
- package/dist/utils/RevisionAwareProcessor.d.ts.map +1 -1
- package/dist/utils/RevisionAwareProcessor.js +2 -2
- package/dist/utils/RevisionAwareProcessor.js.map +1 -1
- package/dist/utils/SelectiveRevisionAcceptor.d.ts +0 -2
- package/dist/utils/SelectiveRevisionAcceptor.d.ts.map +1 -1
- package/dist/utils/SelectiveRevisionAcceptor.js +0 -26
- package/dist/utils/SelectiveRevisionAcceptor.js.map +1 -1
- package/dist/utils/ShadingResolver.d.ts.map +1 -1
- package/dist/utils/ShadingResolver.js.map +1 -1
- package/dist/utils/acceptRevisions.js +1 -1
- package/dist/utils/acceptRevisions.js.map +1 -1
- package/dist/utils/stripTrackedChanges.js +1 -1
- package/dist/utils/stripTrackedChanges.js.map +1 -1
- package/dist/utils/units.d.ts.map +1 -1
- package/dist/utils/units.js +1 -1
- package/dist/utils/units.js.map +1 -1
- package/dist/validation/RevisionAutoFixer.d.ts +2 -1
- package/dist/validation/RevisionAutoFixer.d.ts.map +1 -1
- package/dist/validation/RevisionAutoFixer.js.map +1 -1
- package/package.json +10 -1
- package/src/constants/CLAUDE.md +28 -0
- package/src/core/CLAUDE.md +4 -0
- package/src/core/Document.ts +1755 -85
- package/src/core/DocumentContent.ts +0 -11
- package/src/core/DocumentGenerator.ts +11 -12
- package/src/core/DocumentParser.ts +599 -138
- package/src/core/RelationshipManager.ts +6 -3
- package/src/elements/Bookmark.ts +39 -4
- package/src/elements/BookmarkManager.ts +4 -3
- package/src/elements/CLAUDE.md +18 -2
- package/src/elements/CommonTypes.ts +35 -8
- package/src/elements/Field.ts +1 -1
- package/src/elements/Footer.ts +23 -0
- package/src/elements/Header.ts +25 -0
- package/src/elements/Image.ts +5 -0
- package/src/elements/Paragraph.ts +1069 -41
- package/src/elements/Revision.ts +0 -19
- package/src/elements/RevisionManager.ts +1 -3
- package/src/elements/Run.ts +265 -35
- package/src/elements/Section.ts +214 -8
- package/src/elements/Shape.ts +1 -1
- package/src/elements/Table.ts +850 -61
- package/src/elements/TableCell.ts +84 -10
- package/src/elements/TableGridChange.ts +2 -16
- package/src/elements/TableRow.ts +94 -9
- package/src/formatting/AbstractNumbering.ts +42 -1
- package/src/formatting/CLAUDE.md +4 -0
- package/src/formatting/NumberingLevel.ts +11 -7
- package/src/formatting/Style.ts +39 -71
- package/src/formatting/StylesManager.ts +36 -0
- package/src/helpers/CleanupHelper.ts +1 -1
- package/src/images/ImageOptimizer.ts +0 -3
- package/src/index.ts +1 -1
- package/src/managers/DrawingManager.ts +5 -3
- package/src/tracking/CLAUDE.md +30 -0
- package/src/types/CLAUDE.md +39 -0
- package/src/types/formatting.ts +2 -2
- package/src/utils/CLAUDE.md +15 -0
- package/src/utils/ChangelogGenerator.ts +4 -5
- package/src/utils/InMemoryRevisionAcceptor.ts +0 -9
- package/src/utils/RevisionAwareProcessor.ts +2 -3
- package/src/utils/SelectiveRevisionAcceptor.ts +0 -39
- package/src/utils/ShadingResolver.ts +0 -1
- package/src/utils/acceptRevisions.ts +1 -1
- package/src/utils/stripTrackedChanges.ts +1 -1
- package/src/utils/units.ts +2 -1
- package/src/validation/CLAUDE.md +40 -0
- package/src/validation/RevisionAutoFixer.ts +2 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RelationshipManager.d.ts","sourceRoot":"","sources":["../../src/core/RelationshipManager.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"RelationshipManager.d.ts","sourceRoot":"","sources":["../../src/core/RelationshipManager.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAQhE,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,aAAa,CAA4B;IACjD,OAAO,CAAC,MAAM,CAAS;;IAevB,eAAe,CAAC,YAAY,EAAE,YAAY,GAAG,YAAY;IAmBzD,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAOrD,mBAAmB,IAAI,YAAY,EAAE;IAQrC,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,GAAG,YAAY,EAAE;IAQvE,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IASpC,kBAAkB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAOvC,QAAQ,IAAI,MAAM;IAOlB,KAAK,IAAI,IAAI;IAUb,UAAU,IAAI,MAAM;IAQpB,SAAS,IAAI,YAAY;IASzB,YAAY,IAAI,YAAY;IAS5B,YAAY,IAAI,YAAY;IAS5B,WAAW,IAAI,YAAY;IAS3B,cAAc,IAAI,YAAY;IAS9B,QAAQ,IAAI,YAAY;IAUxB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY;IAUtC,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY;IAUvC,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY;IAUvC,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,YAAY;IAgBvC,qBAAqB,CAAC,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO;IAyBtE,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAgBlE,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,YAAY;IAqB/C,wBAAwB,CAAC,aAAa,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,MAAM;IAyB5D,WAAW,IAAI,YAAY;IAS3B,YAAY,IAAI,YAAY;IAS5B,WAAW,IAAI,YAAY;IAS3B,SAAS,IAAI,YAAY;IASzB,WAAW,IAAI,MAAM;IAmBrB,MAAM,CAAC,iBAAiB,IAAI,mBAAmB;IAe/C,MAAM,CAAC,MAAM,IAAI,mBAAmB;IASpC,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,mBAAmB;CA2DjD"}
|
|
@@ -4,6 +4,7 @@ exports.RelationshipManager = void 0;
|
|
|
4
4
|
const Relationship_1 = require("./Relationship");
|
|
5
5
|
const XMLParser_1 = require("../xml/XMLParser");
|
|
6
6
|
const validation_1 = require("../utils/validation");
|
|
7
|
+
const errors_1 = require("../zip/errors");
|
|
7
8
|
class RelationshipManager {
|
|
8
9
|
relationships;
|
|
9
10
|
nextId;
|
|
@@ -94,7 +95,7 @@ class RelationshipManager {
|
|
|
94
95
|
return false;
|
|
95
96
|
}
|
|
96
97
|
if (relationship.getType() !== Relationship_1.RelationshipType.HYPERLINK) {
|
|
97
|
-
throw new
|
|
98
|
+
throw new errors_1.InvalidDocxError(`Relationship ${relationshipId} is not a hyperlink relationship. ` +
|
|
98
99
|
`Type is ${relationship.getType()}, expected ${Relationship_1.RelationshipType.HYPERLINK}`);
|
|
99
100
|
}
|
|
100
101
|
relationship.setTarget(newUrl);
|
|
@@ -167,11 +168,11 @@ class RelationshipManager {
|
|
|
167
168
|
static fromXml(xml) {
|
|
168
169
|
const manager = new RelationshipManager();
|
|
169
170
|
if (xml.length > 10000000) {
|
|
170
|
-
throw new
|
|
171
|
+
throw new errors_1.CorruptedArchiveError('Relationships XML file too large (>10MB). Possible malicious input or corrupted file.');
|
|
171
172
|
}
|
|
172
173
|
const relationshipElements = XMLParser_1.XMLParser.extractElements(xml, 'Relationship');
|
|
173
174
|
if (relationshipElements.length > 1000) {
|
|
174
|
-
throw new
|
|
175
|
+
throw new errors_1.CorruptedArchiveError('Too many relationships in XML file (>1000). Possible malicious input.');
|
|
175
176
|
}
|
|
176
177
|
for (const relationshipElement of relationshipElements) {
|
|
177
178
|
const id = XMLParser_1.XMLParser.extractAttribute(relationshipElement, 'Id');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RelationshipManager.js","sourceRoot":"","sources":["../../src/core/RelationshipManager.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * RelationshipManager - Manages collections of relationships\n *\n * Handles relationship creation, tracking, and XML generation for various\n * document parts (document.xml, header.xml, footer.xml, etc.)\n */\n\nimport { Relationship, RelationshipType } from './Relationship';\nimport { XMLParser } from '../xml/XMLParser';\nimport { sanitizeHyperlinkUrl } from '../utils/validation';\n\n/**\n * Manages relationships for a document or document part\n */\nexport class RelationshipManager {\n private relationships: Map<string, Relationship>;\n private nextId: number;\n\n /**\n * Creates a new relationship manager\n */\n constructor() {\n this.relationships = new Map();\n this.nextId = 1;\n }\n\n /**\n * Adds a relationship\n * @param relationship The relationship to add\n * @returns The relationship that was added\n */\n addRelationship(relationship: Relationship): Relationship {\n this.relationships.set(relationship.getId(), relationship);\n\n // Update next ID if necessary\n const idMatch = /^rId(\\d+)$/.exec(relationship.getId());\n if (idMatch?.[1]) {\n const idNum = parseInt(idMatch[1], 10);\n if (idNum >= this.nextId) {\n this.nextId = idNum + 1;\n }\n }\n\n return relationship;\n }\n\n /**\n * Gets a relationship by ID\n * @param id The relationship ID\n */\n getRelationship(id: string): Relationship | undefined {\n return this.relationships.get(id);\n }\n\n /**\n * Gets all relationships\n */\n getAllRelationships(): Relationship[] {\n return Array.from(this.relationships.values());\n }\n\n /**\n * Gets relationships of a specific type\n * @param type The relationship type\n */\n getRelationshipsByType(type: string | RelationshipType): Relationship[] {\n return this.getAllRelationships().filter((rel) => rel.getType() === type);\n }\n\n /**\n * Checks if a relationship exists\n * @param id The relationship ID\n */\n hasRelationship(id: string): boolean {\n return this.relationships.has(id);\n }\n\n /**\n * Removes a relationship\n * @param id The relationship ID\n * @returns True if removed, false if not found\n */\n removeRelationship(id: string): boolean {\n return this.relationships.delete(id);\n }\n\n /**\n * Gets the number of relationships\n */\n getCount(): number {\n return this.relationships.size;\n }\n\n /**\n * Clears all relationships\n */\n clear(): this {\n this.relationships.clear();\n this.nextId = 1;\n return this;\n }\n\n /**\n * Generates a new unique relationship ID\n * @returns New relationship ID (e.g., 'rId1', 'rId2')\n */\n generateId(): string {\n return `rId${this.nextId++}`;\n }\n\n /**\n * Adds a styles relationship\n * @returns The created relationship\n */\n addStyles(): Relationship {\n const id = this.generateId();\n return this.addRelationship(Relationship.createStyles(id));\n }\n\n /**\n * Adds a numbering relationship\n * @returns The created relationship\n */\n addNumbering(): Relationship {\n const id = this.generateId();\n return this.addRelationship(Relationship.createNumbering(id));\n }\n\n /**\n * Adds a fontTable relationship\n * @returns The created relationship\n */\n addFontTable(): Relationship {\n const id = this.generateId();\n return this.addRelationship(Relationship.createFontTable(id));\n }\n\n /**\n * Adds a settings relationship\n * @returns The created relationship\n */\n addSettings(): Relationship {\n const id = this.generateId();\n return this.addRelationship(Relationship.createSettings(id));\n }\n\n /**\n * Adds a webSettings relationship\n * @returns The created relationship\n */\n addWebSettings(): Relationship {\n const id = this.generateId();\n return this.addRelationship(Relationship.createWebSettings(id));\n }\n\n /**\n * Adds a theme relationship\n * @returns The created relationship\n */\n addTheme(): Relationship {\n const id = this.generateId();\n return this.addRelationship(Relationship.createTheme(id));\n }\n\n /**\n * Adds an image relationship\n * @param target Image path relative to the part (e.g., 'media/image1.png')\n * @returns The created relationship\n */\n addImage(target: string): Relationship {\n const id = this.generateId();\n return this.addRelationship(Relationship.createImage(id, target));\n }\n\n /**\n * Adds a header relationship\n * @param target Header file path (e.g., 'header1.xml')\n * @returns The created relationship\n */\n addHeader(target: string): Relationship {\n const id = this.generateId();\n return this.addRelationship(Relationship.createHeader(id, target));\n }\n\n /**\n * Adds a footer relationship\n * @param target Footer file path (e.g., 'footer1.xml')\n * @returns The created relationship\n */\n addFooter(target: string): Relationship {\n const id = this.generateId();\n return this.addRelationship(Relationship.createFooter(id, target));\n }\n\n /**\n * Adds a hyperlink relationship\n * @param url The hyperlink URL\n * @returns The created relationship\n */\n addHyperlink(url: string): Relationship {\n const id = this.generateId();\n return this.addRelationship(Relationship.createHyperlink(id, url));\n }\n\n /**\n * Updates the target URL of an existing hyperlink relationship\n *\n * This method modifies an existing relationship's target in-place, maintaining\n * the same relationship ID. This is crucial for proper OpenXML compliance\n * per ECMA-376 §17.16.22, as it prevents orphaned relationships.\n *\n * @param relationshipId The ID of the relationship to update\n * @param newUrl The new URL to set\n * @returns True if updated, false if relationship not found\n */\n updateHyperlinkTarget(relationshipId: string, newUrl: string): boolean {\n const relationship = this.getRelationship(relationshipId);\n if (!relationship) {\n return false;\n }\n\n // Verify this is a hyperlink relationship\n if (relationship.getType() !== RelationshipType.HYPERLINK) {\n throw new Error(\n `Relationship ${relationshipId} is not a hyperlink relationship. ` +\n `Type is ${relationship.getType()}, expected ${RelationshipType.HYPERLINK}`\n );\n }\n\n // Update the target URL\n relationship.setTarget(newUrl);\n return true;\n }\n\n /**\n * Finds a hyperlink relationship by its target URL\n *\n * @param targetUrl The URL to search for\n * @returns The matching relationship, or undefined if not found\n */\n findHyperlinkByTarget(targetUrl: string): Relationship | undefined {\n return this.getAllRelationships().find(\n (rel) => rel.getType() === RelationshipType.HYPERLINK && rel.getTarget() === targetUrl\n );\n }\n\n /**\n * Gets or creates a hyperlink relationship for the given URL\n *\n * This method ensures we don't create duplicate relationships for the same URL.\n * If a relationship already exists for the URL, it returns the existing one.\n * Otherwise, it creates a new relationship.\n *\n * @param url The hyperlink URL\n * @returns The existing or newly created relationship\n */\n getOrCreateHyperlink(url: string): Relationship {\n // Check if relationship already exists for this URL\n const existing = this.findHyperlinkByTarget(url);\n if (existing) {\n return existing;\n }\n\n // Create new relationship\n return this.addHyperlink(url);\n }\n\n /**\n * Removes orphaned hyperlink relationships\n *\n * This method removes hyperlink relationships that are no longer referenced\n * by any hyperlink in the document. Call this after updating URLs to clean\n * up any orphaned relationships.\n *\n * @param referencedIds Set of relationship IDs that are still in use\n * @returns Number of relationships removed\n */\n removeOrphanedHyperlinks(referencedIds: Set<string>): number {\n let removed = 0;\n const toRemove: string[] = [];\n\n // Find orphaned relationships\n for (const rel of this.getAllRelationships()) {\n if (rel.getType() === RelationshipType.HYPERLINK && !referencedIds.has(rel.getId())) {\n toRemove.push(rel.getId());\n }\n }\n\n // Remove orphaned relationships\n for (const id of toRemove) {\n if (this.removeRelationship(id)) {\n removed++;\n }\n }\n\n return removed;\n }\n\n /**\n * Adds a comments relationship\n * @returns The created relationship\n */\n addComments(): Relationship {\n const id = this.generateId();\n return this.addRelationship(Relationship.createComments(id));\n }\n\n /**\n * Adds a footnotes relationship\n * @returns The created relationship\n */\n addFootnotes(): Relationship {\n const id = this.generateId();\n return this.addRelationship(Relationship.createFootnotes(id));\n }\n\n /**\n * Adds an endnotes relationship\n * @returns The created relationship\n */\n addEndnotes(): Relationship {\n const id = this.generateId();\n return this.addRelationship(Relationship.createEndnotes(id));\n }\n\n /**\n * Adds a people relationship (track changes authors)\n * @returns The created relationship\n */\n addPeople(): Relationship {\n const id = this.generateId();\n return this.addRelationship(Relationship.createPeople(id));\n }\n\n /**\n * Generates the relationships XML file content\n * @returns Complete XML string for .rels file\n */\n generateXml(): string {\n const relationships = this.getAllRelationships();\n\n let xml = '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\\n';\n xml += '<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">\\n';\n\n for (const rel of relationships) {\n xml += rel.toXML() + '\\n';\n }\n\n xml += '</Relationships>';\n\n return xml;\n }\n\n /**\n * Creates a new relationship manager with common document relationships\n * @returns RelationshipManager with styles, numbering, fontTable, settings, and theme relationships\n */\n static createForDocument(): RelationshipManager {\n const manager = new RelationshipManager();\n manager.addStyles();\n manager.addNumbering();\n manager.addFontTable();\n manager.addSettings();\n manager.addWebSettings();\n manager.addTheme();\n return manager;\n }\n\n /**\n * Creates an empty relationship manager\n * @returns Empty RelationshipManager\n */\n static create(): RelationshipManager {\n return new RelationshipManager();\n }\n\n /**\n * Parses relationships from XML string and creates a populated manager\n * @param xml The relationships XML content (.rels file)\n * @returns RelationshipManager with parsed relationships\n */\n static fromXml(xml: string): RelationshipManager {\n const manager = new RelationshipManager();\n\n // Prevent ReDoS: validate input size (typical .rels files are < 10KB, max 10MB)\n if (xml.length > 10000000) {\n throw new Error(\n 'Relationships XML file too large (>10MB). Possible malicious input or corrupted file.'\n );\n }\n\n // Use XMLParser to extract all Relationship elements\n const relationshipElements = XMLParser.extractElements(xml, 'Relationship');\n\n // Prevent infinite loops: check relationship count\n if (relationshipElements.length > 1000) {\n throw new Error('Too many relationships in XML file (>1000). Possible malicious input.');\n }\n\n // Process each relationship element\n for (const relationshipElement of relationshipElements) {\n // Extract attributes using XMLParser\n const id = XMLParser.extractAttribute(relationshipElement, 'Id');\n const type = XMLParser.extractAttribute(relationshipElement, 'Type');\n const target = XMLParser.extractAttribute(relationshipElement, 'Target');\n const targetMode = XMLParser.extractAttribute(relationshipElement, 'TargetMode');\n\n // Only create relationship if all required attributes present\n if (id && type && target) {\n // Validate targetMode before type assertion\n const validatedTargetMode =\n targetMode === 'Internal' || targetMode === 'External' || targetMode === undefined\n ? targetMode\n : undefined;\n\n // Sanitize hyperlink URLs (strip browser extension prefixes)\n let sanitizedTarget = target;\n if (type.endsWith('/hyperlink')) {\n const result = sanitizeHyperlinkUrl(target);\n if (result) {\n sanitizedTarget = result.url;\n }\n }\n\n // Create and add relationship\n const relationship = Relationship.create({\n id,\n type,\n target: sanitizedTarget,\n targetMode: validatedTargetMode || 'Internal',\n });\n\n manager.addRelationship(relationship);\n }\n }\n\n return manager;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"RelationshipManager.js","sourceRoot":"","sources":["../../src/core/RelationshipManager.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * RelationshipManager - Manages collections of relationships\n *\n * Handles relationship creation, tracking, and XML generation for various\n * document parts (document.xml, header.xml, footer.xml, etc.)\n */\n\nimport { Relationship, RelationshipType } from './Relationship';\nimport { XMLParser } from '../xml/XMLParser';\nimport { sanitizeHyperlinkUrl } from '../utils/validation';\nimport { InvalidDocxError, CorruptedArchiveError } from '../zip/errors';\n\n/**\n * Manages relationships for a document or document part\n */\nexport class RelationshipManager {\n private relationships: Map<string, Relationship>;\n private nextId: number;\n\n /**\n * Creates a new relationship manager\n */\n constructor() {\n this.relationships = new Map();\n this.nextId = 1;\n }\n\n /**\n * Adds a relationship\n * @param relationship The relationship to add\n * @returns The relationship that was added\n */\n addRelationship(relationship: Relationship): Relationship {\n this.relationships.set(relationship.getId(), relationship);\n\n // Update next ID if necessary\n const idMatch = /^rId(\\d+)$/.exec(relationship.getId());\n if (idMatch?.[1]) {\n const idNum = parseInt(idMatch[1], 10);\n if (idNum >= this.nextId) {\n this.nextId = idNum + 1;\n }\n }\n\n return relationship;\n }\n\n /**\n * Gets a relationship by ID\n * @param id The relationship ID\n */\n getRelationship(id: string): Relationship | undefined {\n return this.relationships.get(id);\n }\n\n /**\n * Gets all relationships\n */\n getAllRelationships(): Relationship[] {\n return Array.from(this.relationships.values());\n }\n\n /**\n * Gets relationships of a specific type\n * @param type The relationship type\n */\n getRelationshipsByType(type: string | RelationshipType): Relationship[] {\n return this.getAllRelationships().filter((rel) => rel.getType() === type);\n }\n\n /**\n * Checks if a relationship exists\n * @param id The relationship ID\n */\n hasRelationship(id: string): boolean {\n return this.relationships.has(id);\n }\n\n /**\n * Removes a relationship\n * @param id The relationship ID\n * @returns True if removed, false if not found\n */\n removeRelationship(id: string): boolean {\n return this.relationships.delete(id);\n }\n\n /**\n * Gets the number of relationships\n */\n getCount(): number {\n return this.relationships.size;\n }\n\n /**\n * Clears all relationships\n */\n clear(): this {\n this.relationships.clear();\n this.nextId = 1;\n return this;\n }\n\n /**\n * Generates a new unique relationship ID\n * @returns New relationship ID (e.g., 'rId1', 'rId2')\n */\n generateId(): string {\n return `rId${this.nextId++}`;\n }\n\n /**\n * Adds a styles relationship\n * @returns The created relationship\n */\n addStyles(): Relationship {\n const id = this.generateId();\n return this.addRelationship(Relationship.createStyles(id));\n }\n\n /**\n * Adds a numbering relationship\n * @returns The created relationship\n */\n addNumbering(): Relationship {\n const id = this.generateId();\n return this.addRelationship(Relationship.createNumbering(id));\n }\n\n /**\n * Adds a fontTable relationship\n * @returns The created relationship\n */\n addFontTable(): Relationship {\n const id = this.generateId();\n return this.addRelationship(Relationship.createFontTable(id));\n }\n\n /**\n * Adds a settings relationship\n * @returns The created relationship\n */\n addSettings(): Relationship {\n const id = this.generateId();\n return this.addRelationship(Relationship.createSettings(id));\n }\n\n /**\n * Adds a webSettings relationship\n * @returns The created relationship\n */\n addWebSettings(): Relationship {\n const id = this.generateId();\n return this.addRelationship(Relationship.createWebSettings(id));\n }\n\n /**\n * Adds a theme relationship\n * @returns The created relationship\n */\n addTheme(): Relationship {\n const id = this.generateId();\n return this.addRelationship(Relationship.createTheme(id));\n }\n\n /**\n * Adds an image relationship\n * @param target Image path relative to the part (e.g., 'media/image1.png')\n * @returns The created relationship\n */\n addImage(target: string): Relationship {\n const id = this.generateId();\n return this.addRelationship(Relationship.createImage(id, target));\n }\n\n /**\n * Adds a header relationship\n * @param target Header file path (e.g., 'header1.xml')\n * @returns The created relationship\n */\n addHeader(target: string): Relationship {\n const id = this.generateId();\n return this.addRelationship(Relationship.createHeader(id, target));\n }\n\n /**\n * Adds a footer relationship\n * @param target Footer file path (e.g., 'footer1.xml')\n * @returns The created relationship\n */\n addFooter(target: string): Relationship {\n const id = this.generateId();\n return this.addRelationship(Relationship.createFooter(id, target));\n }\n\n /**\n * Adds a hyperlink relationship\n * @param url The hyperlink URL\n * @returns The created relationship\n */\n addHyperlink(url: string): Relationship {\n const id = this.generateId();\n return this.addRelationship(Relationship.createHyperlink(id, url));\n }\n\n /**\n * Updates the target URL of an existing hyperlink relationship\n *\n * This method modifies an existing relationship's target in-place, maintaining\n * the same relationship ID. This is crucial for proper OpenXML compliance\n * per ECMA-376 §17.16.22, as it prevents orphaned relationships.\n *\n * @param relationshipId The ID of the relationship to update\n * @param newUrl The new URL to set\n * @returns True if updated, false if relationship not found\n */\n updateHyperlinkTarget(relationshipId: string, newUrl: string): boolean {\n const relationship = this.getRelationship(relationshipId);\n if (!relationship) {\n return false;\n }\n\n // Verify this is a hyperlink relationship\n if (relationship.getType() !== RelationshipType.HYPERLINK) {\n throw new InvalidDocxError(\n `Relationship ${relationshipId} is not a hyperlink relationship. ` +\n `Type is ${relationship.getType()}, expected ${RelationshipType.HYPERLINK}`\n );\n }\n\n // Update the target URL\n relationship.setTarget(newUrl);\n return true;\n }\n\n /**\n * Finds a hyperlink relationship by its target URL\n *\n * @param targetUrl The URL to search for\n * @returns The matching relationship, or undefined if not found\n */\n findHyperlinkByTarget(targetUrl: string): Relationship | undefined {\n return this.getAllRelationships().find(\n (rel) => rel.getType() === RelationshipType.HYPERLINK && rel.getTarget() === targetUrl\n );\n }\n\n /**\n * Gets or creates a hyperlink relationship for the given URL\n *\n * This method ensures we don't create duplicate relationships for the same URL.\n * If a relationship already exists for the URL, it returns the existing one.\n * Otherwise, it creates a new relationship.\n *\n * @param url The hyperlink URL\n * @returns The existing or newly created relationship\n */\n getOrCreateHyperlink(url: string): Relationship {\n // Check if relationship already exists for this URL\n const existing = this.findHyperlinkByTarget(url);\n if (existing) {\n return existing;\n }\n\n // Create new relationship\n return this.addHyperlink(url);\n }\n\n /**\n * Removes orphaned hyperlink relationships\n *\n * This method removes hyperlink relationships that are no longer referenced\n * by any hyperlink in the document. Call this after updating URLs to clean\n * up any orphaned relationships.\n *\n * @param referencedIds Set of relationship IDs that are still in use\n * @returns Number of relationships removed\n */\n removeOrphanedHyperlinks(referencedIds: Set<string>): number {\n let removed = 0;\n const toRemove: string[] = [];\n\n // Find orphaned relationships\n for (const rel of this.getAllRelationships()) {\n if (rel.getType() === RelationshipType.HYPERLINK && !referencedIds.has(rel.getId())) {\n toRemove.push(rel.getId());\n }\n }\n\n // Remove orphaned relationships\n for (const id of toRemove) {\n if (this.removeRelationship(id)) {\n removed++;\n }\n }\n\n return removed;\n }\n\n /**\n * Adds a comments relationship\n * @returns The created relationship\n */\n addComments(): Relationship {\n const id = this.generateId();\n return this.addRelationship(Relationship.createComments(id));\n }\n\n /**\n * Adds a footnotes relationship\n * @returns The created relationship\n */\n addFootnotes(): Relationship {\n const id = this.generateId();\n return this.addRelationship(Relationship.createFootnotes(id));\n }\n\n /**\n * Adds an endnotes relationship\n * @returns The created relationship\n */\n addEndnotes(): Relationship {\n const id = this.generateId();\n return this.addRelationship(Relationship.createEndnotes(id));\n }\n\n /**\n * Adds a people relationship (track changes authors)\n * @returns The created relationship\n */\n addPeople(): Relationship {\n const id = this.generateId();\n return this.addRelationship(Relationship.createPeople(id));\n }\n\n /**\n * Generates the relationships XML file content\n * @returns Complete XML string for .rels file\n */\n generateXml(): string {\n const relationships = this.getAllRelationships();\n\n let xml = '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\\n';\n xml += '<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">\\n';\n\n for (const rel of relationships) {\n xml += rel.toXML() + '\\n';\n }\n\n xml += '</Relationships>';\n\n return xml;\n }\n\n /**\n * Creates a new relationship manager with common document relationships\n * @returns RelationshipManager with styles, numbering, fontTable, settings, and theme relationships\n */\n static createForDocument(): RelationshipManager {\n const manager = new RelationshipManager();\n manager.addStyles();\n manager.addNumbering();\n manager.addFontTable();\n manager.addSettings();\n manager.addWebSettings();\n manager.addTheme();\n return manager;\n }\n\n /**\n * Creates an empty relationship manager\n * @returns Empty RelationshipManager\n */\n static create(): RelationshipManager {\n return new RelationshipManager();\n }\n\n /**\n * Parses relationships from XML string and creates a populated manager\n * @param xml The relationships XML content (.rels file)\n * @returns RelationshipManager with parsed relationships\n */\n static fromXml(xml: string): RelationshipManager {\n const manager = new RelationshipManager();\n\n // Prevent ReDoS: validate input size (typical .rels files are < 10KB, max 10MB)\n if (xml.length > 10000000) {\n throw new CorruptedArchiveError(\n 'Relationships XML file too large (>10MB). Possible malicious input or corrupted file.'\n );\n }\n\n // Use XMLParser to extract all Relationship elements\n const relationshipElements = XMLParser.extractElements(xml, 'Relationship');\n\n // Prevent infinite loops: check relationship count\n if (relationshipElements.length > 1000) {\n throw new CorruptedArchiveError(\n 'Too many relationships in XML file (>1000). Possible malicious input.'\n );\n }\n\n // Process each relationship element\n for (const relationshipElement of relationshipElements) {\n // Extract attributes using XMLParser\n const id = XMLParser.extractAttribute(relationshipElement, 'Id');\n const type = XMLParser.extractAttribute(relationshipElement, 'Type');\n const target = XMLParser.extractAttribute(relationshipElement, 'Target');\n const targetMode = XMLParser.extractAttribute(relationshipElement, 'TargetMode');\n\n // Only create relationship if all required attributes present\n if (id && type && target) {\n // Validate targetMode before type assertion\n const validatedTargetMode =\n targetMode === 'Internal' || targetMode === 'External' || targetMode === undefined\n ? targetMode\n : undefined;\n\n // Sanitize hyperlink URLs (strip browser extension prefixes)\n let sanitizedTarget = target;\n if (type.endsWith('/hyperlink')) {\n const result = sanitizeHyperlinkUrl(target);\n if (result) {\n sanitizedTarget = result.url;\n }\n }\n\n // Create and add relationship\n const relationship = Relationship.create({\n id,\n type,\n target: sanitizedTarget,\n targetMode: validatedTargetMode || 'Internal',\n });\n\n manager.addRelationship(relationship);\n }\n }\n\n return manager;\n }\n}\n"]}
|
|
@@ -3,10 +3,14 @@ export interface BookmarkProperties {
|
|
|
3
3
|
id?: number;
|
|
4
4
|
name: string;
|
|
5
5
|
skipNormalization?: boolean;
|
|
6
|
+
colFirst?: number;
|
|
7
|
+
colLast?: number;
|
|
6
8
|
}
|
|
7
9
|
export declare class Bookmark {
|
|
8
10
|
private id;
|
|
9
11
|
private name;
|
|
12
|
+
private colFirst?;
|
|
13
|
+
private colLast?;
|
|
10
14
|
constructor(properties: BookmarkProperties);
|
|
11
15
|
private normalizeName;
|
|
12
16
|
getId(): number;
|
|
@@ -14,6 +18,9 @@ export declare class Bookmark {
|
|
|
14
18
|
getName(): string;
|
|
15
19
|
setName(name: string): this;
|
|
16
20
|
setRawName(name: string): this;
|
|
21
|
+
getColFirst(): number | undefined;
|
|
22
|
+
getColLast(): number | undefined;
|
|
23
|
+
setColumnRange(colFirst: number, colLast: number): this;
|
|
17
24
|
toStartXML(): XMLElement;
|
|
18
25
|
toEndXML(): XMLElement;
|
|
19
26
|
toXML(): [XMLElement, XMLElement];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Bookmark.d.ts","sourceRoot":"","sources":["../../src/elements/Bookmark.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAK/C,MAAM,WAAW,kBAAkB;IAEjC,EAAE,CAAC,EAAE,MAAM,CAAC;IAEZ,IAAI,EAAE,MAAM,CAAC;IAEb,iBAAiB,CAAC,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"Bookmark.d.ts","sourceRoot":"","sources":["../../src/elements/Bookmark.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAK/C,MAAM,WAAW,kBAAkB;IAEjC,EAAE,CAAC,EAAE,MAAM,CAAC;IAEZ,IAAI,EAAE,MAAM,CAAC;IAEb,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAE5B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAKD,qBAAa,QAAQ;IACnB,OAAO,CAAC,EAAE,CAAS;IACnB,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,QAAQ,CAAC,CAAS;IAC1B,OAAO,CAAC,OAAO,CAAC,CAAS;gBAMb,UAAU,EAAE,kBAAkB;IAoB1C,OAAO,CAAC,aAAa;IAyBrB,KAAK,IAAI,MAAM;IAQf,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAOvB,OAAO,IAAI,MAAM;IAejB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IA4B3B,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAQ9B,WAAW,IAAI,MAAM,GAAG,SAAS;IAOjC,UAAU,IAAI,MAAM,GAAG,SAAS;IAOhC,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAUvD,UAAU,IAAI,UAAU;IAmBxB,QAAQ,IAAI,UAAU;IActB,KAAK,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC;IASjC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ;IAUrC,MAAM,CAAC,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,QAAQ;IAetD,MAAM,CAAC,UAAU,CAAC,MAAM,SAAa,GAAG,QAAQ;CAMjD"}
|
|
@@ -4,11 +4,15 @@ exports.Bookmark = void 0;
|
|
|
4
4
|
class Bookmark {
|
|
5
5
|
id;
|
|
6
6
|
name;
|
|
7
|
+
colFirst;
|
|
8
|
+
colLast;
|
|
7
9
|
constructor(properties) {
|
|
8
10
|
this.id = properties.id ?? 0;
|
|
9
11
|
this.name = properties.skipNormalization
|
|
10
12
|
? properties.name
|
|
11
13
|
: this.normalizeName(properties.name);
|
|
14
|
+
this.colFirst = properties.colFirst;
|
|
15
|
+
this.colLast = properties.colLast;
|
|
12
16
|
}
|
|
13
17
|
normalizeName(name) {
|
|
14
18
|
let normalized = name.replace(/[^a-zA-Z0-9_]/g, '_');
|
|
@@ -40,13 +44,29 @@ class Bookmark {
|
|
|
40
44
|
this.name = name;
|
|
41
45
|
return this;
|
|
42
46
|
}
|
|
47
|
+
getColFirst() {
|
|
48
|
+
return this.colFirst;
|
|
49
|
+
}
|
|
50
|
+
getColLast() {
|
|
51
|
+
return this.colLast;
|
|
52
|
+
}
|
|
53
|
+
setColumnRange(colFirst, colLast) {
|
|
54
|
+
this.colFirst = colFirst;
|
|
55
|
+
this.colLast = colLast;
|
|
56
|
+
return this;
|
|
57
|
+
}
|
|
43
58
|
toStartXML() {
|
|
59
|
+
const attrs = {
|
|
60
|
+
'w:id': this.id.toString(),
|
|
61
|
+
'w:name': this.name,
|
|
62
|
+
};
|
|
63
|
+
if (this.colFirst !== undefined)
|
|
64
|
+
attrs['w:colFirst'] = this.colFirst.toString();
|
|
65
|
+
if (this.colLast !== undefined)
|
|
66
|
+
attrs['w:colLast'] = this.colLast.toString();
|
|
44
67
|
return {
|
|
45
68
|
name: 'w:bookmarkStart',
|
|
46
|
-
attributes:
|
|
47
|
-
'w:id': this.id.toString(),
|
|
48
|
-
'w:name': this.name,
|
|
49
|
-
},
|
|
69
|
+
attributes: attrs,
|
|
50
70
|
selfClosing: true,
|
|
51
71
|
};
|
|
52
72
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Bookmark.js","sourceRoot":"","sources":["../../src/elements/Bookmark.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"Bookmark.js","sourceRoot":"","sources":["../../src/elements/Bookmark.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Bookmark - Represents a bookmark in a Word document\n *\n * Bookmarks mark specific locations in a document for internal navigation.\n * They consist of a start marker and an end marker with matching IDs.\n */\n\nimport { XMLElement } from '../xml/XMLBuilder';\n\n/**\n * Bookmark properties\n */\nexport interface BookmarkProperties {\n /** Unique bookmark ID (generated automatically if not provided) */\n id?: number;\n /** Bookmark name (must be unique within document) */\n name: string;\n /** Skip name normalization (used when loading from existing documents) */\n skipNormalization?: boolean;\n /** First column in table bookmark range (ECMA-376 §17.16.5) */\n colFirst?: number;\n /** Last column in table bookmark range (ECMA-376 §17.16.5) */\n colLast?: number;\n}\n\n/**\n * Represents a bookmark location in a document\n */\nexport class Bookmark {\n private id: number;\n private name: string;\n private colFirst?: number;\n private colLast?: number;\n\n /**\n * Creates a new Bookmark\n * @param properties - Bookmark properties\n */\n constructor(properties: BookmarkProperties) {\n this.id = properties.id ?? 0; // ID will be assigned by BookmarkManager\n // Preserve exact bookmark names when loading from documents (Word allows =, ., etc.)\n // Only normalize when creating new bookmarks programmatically\n this.name = properties.skipNormalization\n ? properties.name\n : this.normalizeName(properties.name);\n this.colFirst = properties.colFirst;\n this.colLast = properties.colLast;\n }\n\n /**\n * Normalizes a bookmark name to be valid\n * - Must start with a letter or underscore\n * - Can only contain letters, numbers, and underscores\n * - Maximum 40 characters\n * - Case-insensitive (Word converts to lowercase)\n * @param name - Raw bookmark name\n * @returns Normalized bookmark name\n */\n private normalizeName(name: string): string {\n // Remove invalid characters\n let normalized = name.replace(/[^a-zA-Z0-9_]/g, '_');\n\n // Ensure it starts with a letter or underscore\n if (normalized.length > 0 && /^\\d/.test(normalized)) {\n normalized = '_' + normalized;\n }\n\n // Limit to 40 characters\n if (normalized.length > 40) {\n normalized = normalized.substring(0, 40);\n }\n\n // Default if empty\n if (normalized.length === 0) {\n normalized = '_bookmark';\n }\n\n return normalized;\n }\n\n /**\n * Gets the bookmark ID\n */\n getId(): number {\n return this.id;\n }\n\n /**\n * Sets the bookmark ID (used by BookmarkManager)\n * @internal\n */\n setId(id: number): void {\n this.id = id;\n }\n\n /**\n * Gets the bookmark name\n */\n getName(): string {\n return this.name;\n }\n\n /**\n * Sets the bookmark name (normalizes the name)\n *\n * The name will be normalized:\n * - Invalid characters replaced with underscores\n * - Leading digits prefixed with underscore\n * - Limited to 40 characters\n *\n * @param name - New bookmark name\n * @returns This bookmark for chaining\n */\n setName(name: string): this {\n this.name = this.normalizeName(name);\n return this;\n }\n\n /**\n * Sets the bookmark name without normalization\n *\n * Use this method when:\n * - Preserving exact names from imported documents\n * - Setting names with special characters that Word allows (=, ., etc.)\n * - Round-trip fidelity is required\n *\n * **Warning:** Setting invalid bookmark names may cause issues in Word.\n * Only use this if you know the name is valid or needs to match an existing document.\n *\n * @param name - Raw bookmark name (not normalized)\n * @returns This bookmark for chaining\n *\n * @example\n * ```typescript\n * // Preserve exact name from Word document\n * bookmark.setRawName('SECTION=II.MNKE7E8NA385_');\n *\n * // For new bookmarks, prefer setName() which normalizes\n * bookmark.setName('My Heading'); // Becomes 'My_Heading'\n * ```\n */\n setRawName(name: string): this {\n this.name = name;\n return this;\n }\n\n /**\n * Gets the first column in a table bookmark range\n */\n getColFirst(): number | undefined {\n return this.colFirst;\n }\n\n /**\n * Gets the last column in a table bookmark range\n */\n getColLast(): number | undefined {\n return this.colLast;\n }\n\n /**\n * Sets the column range for a table bookmark (ECMA-376 §17.16.5)\n */\n setColumnRange(colFirst: number, colLast: number): this {\n this.colFirst = colFirst;\n this.colLast = colLast;\n return this;\n }\n\n /**\n * Generates XML for the bookmark start marker\n * @returns XMLElement for bookmarkStart\n */\n toStartXML(): XMLElement {\n const attrs: Record<string, string | number> = {\n 'w:id': this.id.toString(),\n 'w:name': this.name,\n };\n // Table bookmark column range per ECMA-376 §17.16.5\n if (this.colFirst !== undefined) attrs['w:colFirst'] = this.colFirst.toString();\n if (this.colLast !== undefined) attrs['w:colLast'] = this.colLast.toString();\n return {\n name: 'w:bookmarkStart',\n attributes: attrs,\n selfClosing: true,\n };\n }\n\n /**\n * Generates XML for the bookmark end marker\n * @returns XMLElement for bookmarkEnd\n */\n toEndXML(): XMLElement {\n return {\n name: 'w:bookmarkEnd',\n attributes: {\n 'w:id': this.id.toString(),\n },\n selfClosing: true,\n };\n }\n\n /**\n * Generates both start and end XML elements as an array\n * @returns Array of XMLElements [start, end]\n */\n toXML(): [XMLElement, XMLElement] {\n return [this.toStartXML(), this.toEndXML()];\n }\n\n /**\n * Creates a new Bookmark\n * @param name - Bookmark name\n * @returns New Bookmark instance\n */\n static create(name: string): Bookmark {\n return new Bookmark({ name });\n }\n\n /**\n * Creates a bookmark for a heading\n * Useful for table of contents internal links\n * @param headingText - The text of the heading\n * @returns New Bookmark instance with normalized name\n */\n static createForHeading(headingText: string): Bookmark {\n // Create a bookmark name from heading text\n // Example: \"Chapter 1: Introduction\" -> \"_Chapter_1_Introduction\"\n const name = headingText\n .trim()\n .replace(/[^a-zA-Z0-9]+/g, '_')\n .substring(0, 40);\n return new Bookmark({ name: name || '_heading' });\n }\n\n /**\n * Creates a bookmark with an auto-generated unique name\n * @param prefix - Optional prefix for the name (default: 'bookmark')\n * @returns New Bookmark instance\n */\n static createAuto(prefix = 'bookmark'): Bookmark {\n const timestamp = Date.now().toString(36);\n const random = Math.random().toString(36).substring(2, 7);\n const name = `${prefix}_${timestamp}_${random}`;\n return new Bookmark({ name });\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BookmarkManager.d.ts","sourceRoot":"","sources":["../../src/elements/BookmarkManager.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"BookmarkManager.d.ts","sourceRoot":"","sources":["../../src/elements/BookmarkManager.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAOtC,MAAM,MAAM,kBAAkB,GAAG,MAAM,MAAM,CAAC;AAM9C,MAAM,MAAM,gBAAgB,GAAG,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;AAK5D,qBAAa,eAAe;IAC1B,OAAO,CAAC,SAAS,CAA+B;IAChD,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,UAAU,CAAmC;IACrD,OAAO,CAAC,gBAAgB,CAAiC;IAUzD,aAAa,CAAC,QAAQ,EAAE,kBAAkB,EAAE,cAAc,CAAC,EAAE,gBAAgB,GAAG,IAAI;IAYpF,QAAQ,CAAC,QAAQ,EAAE,QAAQ,GAAG,QAAQ;IA2BtC,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,GAAG,QAAQ;IAgC9C,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS;IAS/C,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAQlC,eAAe,IAAI,QAAQ,EAAE;IAQ7B,QAAQ,IAAI,MAAM;IASlB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAOrC,KAAK,IAAI,IAAI;IAUb,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAU3B,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM;IAgCvC,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ;IAYtC,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,QAAQ;IAWpD,QAAQ,IAAI;QACV,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,KAAK,EAAE,MAAM,EAAE,CAAC;KACjB;IAYD,MAAM,CAAC,MAAM,IAAI,eAAe;CAGjC"}
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.BookmarkManager = void 0;
|
|
4
4
|
const Bookmark_1 = require("./Bookmark");
|
|
5
|
+
const errors_1 = require("../zip/errors");
|
|
5
6
|
class BookmarkManager {
|
|
6
7
|
bookmarks = new Map();
|
|
7
8
|
nextId = 0;
|
|
@@ -14,7 +15,7 @@ class BookmarkManager {
|
|
|
14
15
|
register(bookmark) {
|
|
15
16
|
const name = bookmark.getName();
|
|
16
17
|
if (this.bookmarks.has(name)) {
|
|
17
|
-
throw new
|
|
18
|
+
throw new errors_1.InvalidDocxError(`Bookmark with name "${name}" already exists. Bookmark names must be unique within a document.`);
|
|
18
19
|
}
|
|
19
20
|
const id = this.idProvider ? this.idProvider() : this.nextId++;
|
|
20
21
|
bookmark.setId(id);
|
|
@@ -25,7 +26,7 @@ class BookmarkManager {
|
|
|
25
26
|
const name = bookmark.getName();
|
|
26
27
|
const existingId = bookmark.getId();
|
|
27
28
|
if (this.bookmarks.has(name)) {
|
|
28
|
-
throw new
|
|
29
|
+
throw new errors_1.InvalidDocxError(`Bookmark with name "${name}" already exists. Bookmark names must be unique within a document.`);
|
|
29
30
|
}
|
|
30
31
|
if (this.idExistsNotifier) {
|
|
31
32
|
this.idExistsNotifier(existingId);
|
|
@@ -74,7 +75,7 @@ class BookmarkManager {
|
|
|
74
75
|
}
|
|
75
76
|
counter++;
|
|
76
77
|
}
|
|
77
|
-
throw new
|
|
78
|
+
throw new errors_1.InvalidDocxError(`Could not generate unique bookmark name from base "${baseName}"`);
|
|
78
79
|
}
|
|
79
80
|
createBookmark(name) {
|
|
80
81
|
const uniqueName = this.getUniqueName(name);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BookmarkManager.js","sourceRoot":"","sources":["../../src/elements/BookmarkManager.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * BookmarkManager - Manages bookmarks in a document\n *\n * Tracks all bookmarks, assigns unique IDs, and ensures name uniqueness.\n *\n * Per ECMA-376, bookmark IDs must be unique across ALL annotation types\n * in a document. Use setIdProvider() to connect to a centralized ID allocator.\n */\n\nimport { Bookmark } from './Bookmark';\n\n/**\n * Type for the centralized ID provider callback.\n * Returns the next available annotation ID from a shared counter.\n */\nexport type IdProviderCallback = () => number;\n\n/**\n * Type for callback to notify of existing IDs (for synchronization).\n * Called when registering an existing bookmark to keep the central counter in sync.\n */\nexport type IdExistsCallback = (existingId: number) => void;\n\n/**\n * Manages document bookmarks\n */\nexport class BookmarkManager {\n private bookmarks = new Map<string, Bookmark>();\n private nextId = 0;\n private idProvider: IdProviderCallback | null = null;\n private idExistsNotifier: IdExistsCallback | null = null;\n\n /**\n * Sets the centralized ID provider callback.\n * When set, IDs will be allocated from the centralized DocumentIdManager\n * instead of the local nextId counter.\n *\n * @param provider - Callback that returns the next available ID\n * @param existsNotifier - Optional callback to notify when existing IDs are found\n */\n setIdProvider(provider: IdProviderCallback, existsNotifier?: IdExistsCallback): void {\n this.idProvider = provider;\n this.idExistsNotifier = existsNotifier || null;\n }\n\n /**\n * Registers a bookmark with the manager\n * Assigns a unique ID and ensures name uniqueness\n * @param bookmark - Bookmark to register\n * @returns The registered bookmark (same instance)\n * @throws Error if a bookmark with the same name already exists\n */\n register(bookmark: Bookmark): Bookmark {\n const name = bookmark.getName();\n\n // Check for duplicate names\n if (this.bookmarks.has(name)) {\n throw new Error(\n `Bookmark with name \"${name}\" already exists. Bookmark names must be unique within a document.`\n );\n }\n\n // Assign unique ID - use centralized provider if available\n const id = this.idProvider ? this.idProvider() : this.nextId++;\n bookmark.setId(id);\n\n // Store bookmark\n this.bookmarks.set(name, bookmark);\n\n return bookmark;\n }\n\n /**\n * Registers an existing bookmark, preserving its ID\n * Used when loading documents to preserve original bookmark IDs and avoid collisions\n * @param bookmark - Bookmark with existing ID to register\n * @returns The registered bookmark (same instance)\n * @throws Error if a bookmark with the same name already exists\n */\n registerExisting(bookmark: Bookmark): Bookmark {\n const name = bookmark.getName();\n const existingId = bookmark.getId();\n\n // Check for duplicate names\n if (this.bookmarks.has(name)) {\n throw new Error(\n `Bookmark with name \"${name}\" already exists. Bookmark names must be unique within a document.`\n );\n }\n\n // Notify centralized ID manager about this existing ID\n if (this.idExistsNotifier) {\n this.idExistsNotifier(existingId);\n }\n\n // Also update local nextId to avoid collisions (for fallback)\n if (existingId >= this.nextId) {\n this.nextId = existingId + 1;\n }\n\n // Store bookmark (keep its existing ID)\n this.bookmarks.set(name, bookmark);\n\n return bookmark;\n }\n\n /**\n * Gets a bookmark by name\n * @param name - Bookmark name\n * @returns The bookmark, or undefined if not found\n */\n getBookmark(name: string): Bookmark | undefined {\n return this.bookmarks.get(name);\n }\n\n /**\n * Checks if a bookmark exists\n * @param name - Bookmark name\n * @returns True if the bookmark exists\n */\n hasBookmark(name: string): boolean {\n return this.bookmarks.has(name);\n }\n\n /**\n * Gets all bookmarks\n * @returns Array of all bookmarks\n */\n getAllBookmarks(): Bookmark[] {\n return Array.from(this.bookmarks.values());\n }\n\n /**\n * Gets the number of bookmarks\n * @returns Number of bookmarks\n */\n getCount(): number {\n return this.bookmarks.size;\n }\n\n /**\n * Removes a bookmark\n * @param name - Bookmark name\n * @returns True if the bookmark was removed\n */\n removeBookmark(name: string): boolean {\n return this.bookmarks.delete(name);\n }\n\n /**\n * Clears all bookmarks\n */\n clear(): void {\n this.bookmarks.clear();\n this.nextId = 0;\n }\n\n /**\n * Sets the next ID to be assigned\n * Used when loading documents to avoid ID collisions with existing bookmarks\n * @param id - The next ID value to use\n */\n setNextId(id: number): void {\n this.nextId = id;\n }\n\n /**\n * Gets a unique bookmark name by adding a suffix if needed\n * Ensures the returned name is always within the 40-character limit\n * @param baseName - Base name for the bookmark\n * @returns A unique bookmark name (max 40 characters)\n */\n getUniqueName(baseName: string): string {\n const maxLength = 40;\n\n if (!this.hasBookmark(baseName)) {\n return baseName;\n }\n\n // Try adding numbers until we find a unique name\n let counter = 1;\n while (counter <= 1000) {\n const suffix = `_${counter}`;\n\n // Truncate base name to leave room for suffix within 40-char limit\n const maxBase = maxLength - suffix.length;\n const truncatedBase = baseName.length > maxBase ? baseName.substring(0, maxBase) : baseName;\n\n const uniqueName = `${truncatedBase}${suffix}`;\n\n if (!this.hasBookmark(uniqueName)) {\n return uniqueName;\n }\n counter++;\n }\n\n throw new Error(`Could not generate unique bookmark name from base \"${baseName}\"`);\n }\n\n /**\n * Creates and registers a new bookmark with a unique name\n * @param name - Desired bookmark name\n * @returns The created and registered bookmark\n */\n createBookmark(name: string): Bookmark {\n const uniqueName = this.getUniqueName(name);\n const bookmark = Bookmark.create(uniqueName);\n return this.register(bookmark);\n }\n\n /**\n * Creates and registers a bookmark for a heading\n * Automatically generates a unique name from the heading text\n * @param headingText - The text of the heading\n * @returns The created and registered bookmark\n */\n createHeadingBookmark(headingText: string): Bookmark {\n const bookmark = Bookmark.createForHeading(headingText);\n const uniqueName = this.getUniqueName(bookmark.getName());\n bookmark.setName(uniqueName);\n return this.register(bookmark);\n }\n\n /**\n * Gets statistics about bookmarks\n * @returns Object with bookmark statistics\n */\n getStats(): {\n total: number;\n nextId: number;\n names: string[];\n } {\n return {\n total: this.bookmarks.size,\n nextId: this.nextId,\n names: Array.from(this.bookmarks.keys()),\n };\n }\n\n /**\n * Creates a new BookmarkManager\n * @returns New BookmarkManager instance\n */\n static create(): BookmarkManager {\n return new BookmarkManager();\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"BookmarkManager.js","sourceRoot":"","sources":["../../src/elements/BookmarkManager.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * BookmarkManager - Manages bookmarks in a document\n *\n * Tracks all bookmarks, assigns unique IDs, and ensures name uniqueness.\n *\n * Per ECMA-376, bookmark IDs must be unique across ALL annotation types\n * in a document. Use setIdProvider() to connect to a centralized ID allocator.\n */\n\nimport { Bookmark } from './Bookmark';\nimport { InvalidDocxError } from '../zip/errors';\n\n/**\n * Type for the centralized ID provider callback.\n * Returns the next available annotation ID from a shared counter.\n */\nexport type IdProviderCallback = () => number;\n\n/**\n * Type for callback to notify of existing IDs (for synchronization).\n * Called when registering an existing bookmark to keep the central counter in sync.\n */\nexport type IdExistsCallback = (existingId: number) => void;\n\n/**\n * Manages document bookmarks\n */\nexport class BookmarkManager {\n private bookmarks = new Map<string, Bookmark>();\n private nextId = 0;\n private idProvider: IdProviderCallback | null = null;\n private idExistsNotifier: IdExistsCallback | null = null;\n\n /**\n * Sets the centralized ID provider callback.\n * When set, IDs will be allocated from the centralized DocumentIdManager\n * instead of the local nextId counter.\n *\n * @param provider - Callback that returns the next available ID\n * @param existsNotifier - Optional callback to notify when existing IDs are found\n */\n setIdProvider(provider: IdProviderCallback, existsNotifier?: IdExistsCallback): void {\n this.idProvider = provider;\n this.idExistsNotifier = existsNotifier || null;\n }\n\n /**\n * Registers a bookmark with the manager\n * Assigns a unique ID and ensures name uniqueness\n * @param bookmark - Bookmark to register\n * @returns The registered bookmark (same instance)\n * @throws Error if a bookmark with the same name already exists\n */\n register(bookmark: Bookmark): Bookmark {\n const name = bookmark.getName();\n\n // Check for duplicate names\n if (this.bookmarks.has(name)) {\n throw new InvalidDocxError(\n `Bookmark with name \"${name}\" already exists. Bookmark names must be unique within a document.`\n );\n }\n\n // Assign unique ID - use centralized provider if available\n const id = this.idProvider ? this.idProvider() : this.nextId++;\n bookmark.setId(id);\n\n // Store bookmark\n this.bookmarks.set(name, bookmark);\n\n return bookmark;\n }\n\n /**\n * Registers an existing bookmark, preserving its ID\n * Used when loading documents to preserve original bookmark IDs and avoid collisions\n * @param bookmark - Bookmark with existing ID to register\n * @returns The registered bookmark (same instance)\n * @throws Error if a bookmark with the same name already exists\n */\n registerExisting(bookmark: Bookmark): Bookmark {\n const name = bookmark.getName();\n const existingId = bookmark.getId();\n\n // Check for duplicate names\n if (this.bookmarks.has(name)) {\n throw new InvalidDocxError(\n `Bookmark with name \"${name}\" already exists. Bookmark names must be unique within a document.`\n );\n }\n\n // Notify centralized ID manager about this existing ID\n if (this.idExistsNotifier) {\n this.idExistsNotifier(existingId);\n }\n\n // Also update local nextId to avoid collisions (for fallback)\n if (existingId >= this.nextId) {\n this.nextId = existingId + 1;\n }\n\n // Store bookmark (keep its existing ID)\n this.bookmarks.set(name, bookmark);\n\n return bookmark;\n }\n\n /**\n * Gets a bookmark by name\n * @param name - Bookmark name\n * @returns The bookmark, or undefined if not found\n */\n getBookmark(name: string): Bookmark | undefined {\n return this.bookmarks.get(name);\n }\n\n /**\n * Checks if a bookmark exists\n * @param name - Bookmark name\n * @returns True if the bookmark exists\n */\n hasBookmark(name: string): boolean {\n return this.bookmarks.has(name);\n }\n\n /**\n * Gets all bookmarks\n * @returns Array of all bookmarks\n */\n getAllBookmarks(): Bookmark[] {\n return Array.from(this.bookmarks.values());\n }\n\n /**\n * Gets the number of bookmarks\n * @returns Number of bookmarks\n */\n getCount(): number {\n return this.bookmarks.size;\n }\n\n /**\n * Removes a bookmark\n * @param name - Bookmark name\n * @returns True if the bookmark was removed\n */\n removeBookmark(name: string): boolean {\n return this.bookmarks.delete(name);\n }\n\n /**\n * Clears all bookmarks\n */\n clear(): void {\n this.bookmarks.clear();\n this.nextId = 0;\n }\n\n /**\n * Sets the next ID to be assigned\n * Used when loading documents to avoid ID collisions with existing bookmarks\n * @param id - The next ID value to use\n */\n setNextId(id: number): void {\n this.nextId = id;\n }\n\n /**\n * Gets a unique bookmark name by adding a suffix if needed\n * Ensures the returned name is always within the 40-character limit\n * @param baseName - Base name for the bookmark\n * @returns A unique bookmark name (max 40 characters)\n */\n getUniqueName(baseName: string): string {\n const maxLength = 40;\n\n if (!this.hasBookmark(baseName)) {\n return baseName;\n }\n\n // Try adding numbers until we find a unique name\n let counter = 1;\n while (counter <= 1000) {\n const suffix = `_${counter}`;\n\n // Truncate base name to leave room for suffix within 40-char limit\n const maxBase = maxLength - suffix.length;\n const truncatedBase = baseName.length > maxBase ? baseName.substring(0, maxBase) : baseName;\n\n const uniqueName = `${truncatedBase}${suffix}`;\n\n if (!this.hasBookmark(uniqueName)) {\n return uniqueName;\n }\n counter++;\n }\n\n throw new InvalidDocxError(`Could not generate unique bookmark name from base \"${baseName}\"`);\n }\n\n /**\n * Creates and registers a new bookmark with a unique name\n * @param name - Desired bookmark name\n * @returns The created and registered bookmark\n */\n createBookmark(name: string): Bookmark {\n const uniqueName = this.getUniqueName(name);\n const bookmark = Bookmark.create(uniqueName);\n return this.register(bookmark);\n }\n\n /**\n * Creates and registers a bookmark for a heading\n * Automatically generates a unique name from the heading text\n * @param headingText - The text of the heading\n * @returns The created and registered bookmark\n */\n createHeadingBookmark(headingText: string): Bookmark {\n const bookmark = Bookmark.createForHeading(headingText);\n const uniqueName = this.getUniqueName(bookmark.getName());\n bookmark.setName(uniqueName);\n return this.register(bookmark);\n }\n\n /**\n * Gets statistics about bookmarks\n * @returns Object with bookmark statistics\n */\n getStats(): {\n total: number;\n nextId: number;\n names: string[];\n } {\n return {\n total: this.bookmarks.size,\n nextId: this.nextId,\n names: Array.from(this.bookmarks.keys()),\n };\n }\n\n /**\n * Creates a new BookmarkManager\n * @returns New BookmarkManager instance\n */\n static create(): BookmarkManager {\n return new BookmarkManager();\n }\n}\n"]}
|
|
@@ -23,8 +23,8 @@ export type HorizontalAlignment = 'left' | 'center' | 'right' | 'inside' | 'outs
|
|
|
23
23
|
export type VerticalAlignment = 'top' | 'center' | 'bottom' | 'inside' | 'outside';
|
|
24
24
|
export type PageVerticalAlignment = 'top' | 'center' | 'bottom' | 'both';
|
|
25
25
|
export type CellVerticalAlignment = 'top' | 'center' | 'bottom';
|
|
26
|
-
export type ParagraphAlignment = 'left' | 'center' | 'right' | 'justify' | 'both';
|
|
27
|
-
export type TableAlignment = 'left' | 'center' | 'right';
|
|
26
|
+
export type ParagraphAlignment = 'left' | 'center' | 'right' | 'justify' | 'both' | 'start' | 'end' | 'distribute' | 'mediumKashida' | 'highKashida' | 'lowKashida' | 'thaiDistribute';
|
|
27
|
+
export type TableAlignment = 'left' | 'center' | 'right' | 'start' | 'end';
|
|
28
28
|
export type RowJustification = 'left' | 'center' | 'right' | 'start' | 'end';
|
|
29
29
|
export type TextVerticalAlignment = 'top' | 'center' | 'baseline' | 'bottom' | 'auto';
|
|
30
30
|
export type TabAlignment = 'clear' | 'left' | 'center' | 'right' | 'decimal' | 'bar' | 'num';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CommonTypes.d.ts","sourceRoot":"","sources":["../../src/elements/CommonTypes.ts"],"names":[],"mappings":"AAyBA,MAAM,MAAM,cAAc,GAEtB,OAAO,GACP,OAAO,GAEP,YAAY,GACZ,YAAY,GACZ,mBAAmB,GACnB,YAAY,GAEZ,WAAW,GACX,WAAW,GAEX,gBAAgB,GAChB,gBAAgB,GAChB,uBAAuB,GACvB,gBAAgB,GAEhB,eAAe,GACf,eAAe,GAEf,MAAM,GACN,OAAO,GACP,OAAO,GACP,OAAO,GACP,OAAO,GACP,OAAO,GACP,OAAO,GACP,OAAO,GACP,OAAO,GACP,OAAO,GACP,OAAO,GACP,OAAO,GACP,OAAO,GACP,OAAO,GACP,OAAO,GACP,OAAO,GACP,OAAO,GACP,OAAO,GACP,OAAO,GACP,OAAO,GACP,OAAO,GACP,OAAO,GACP,OAAO,GACP,KAAK,CAAC;AAMV,MAAM,MAAM,mBAAmB,GAC3B,OAAO,GACP,OAAO,GACP,YAAY,GACZ,YAAY,GACZ,mBAAmB,GACnB,YAAY,GACZ,WAAW,GACX,WAAW,GACX,gBAAgB,GAChB,gBAAgB,GAChB,uBAAuB,GACvB,gBAAgB,GAChB,eAAe,GACf,eAAe,CAAC;AAYpB,MAAM,MAAM,WAAW,GACnB,MAAM,GACN,QAAQ,GACR,QAAQ,GACR,QAAQ,GACR,QAAQ,GACR,OAAO,CAAC;AAQZ,MAAM,MAAM,mBAAmB,GAC3B,WAAW,GACX,MAAM,GACN,gBAAgB,GAChB,cAAc,GACd,eAAe,CAAC;AAMpB,MAAM,MAAM,eAAe,GACvB,mBAAmB,GACnB,SAAS,GACT,YAAY,GACZ,QAAQ,GACR,mBAAmB,GACnB,mBAAmB,GACnB,uBAAuB,GACvB,oBAAoB,GACpB,oBAAoB,GACpB,wBAAwB,GACxB,mBAAmB,GACnB,mBAAmB,GACnB,uBAAuB,GACvB,cAAc,GACd,gBAAgB,GAChB,QAAQ,GACR,OAAO,CAAC;AAQZ,MAAM,WAAW,gBAAgB;IAE/B,KAAK,CAAC,EAAE,WAAW,GAAG,mBAAmB,CAAC;IAE1C,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAKD,MAAM,WAAW,gBAAgB;IAC/B,GAAG,CAAC,EAAE,gBAAgB,CAAC;IACvB,MAAM,CAAC,EAAE,gBAAgB,CAAC;IAC1B,IAAI,CAAC,EAAE,gBAAgB,CAAC;IACxB,KAAK,CAAC,EAAE,gBAAgB,CAAC;CAC1B;AAKD,MAAM,WAAW,sBAAuB,SAAQ,gBAAgB;IAE9D,OAAO,CAAC,EAAE,gBAAgB,CAAC;IAE3B,OAAO,CAAC,EAAE,gBAAgB,CAAC;CAC5B;AAWD,MAAM,MAAM,mBAAmB,GAC3B,MAAM,GACN,QAAQ,GACR,OAAO,GACP,QAAQ,GACR,SAAS,CAAC;AAOd,MAAM,MAAM,iBAAiB,GACzB,KAAK,GACL,QAAQ,GACR,QAAQ,GACR,QAAQ,GACR,SAAS,CAAC;AAOd,MAAM,MAAM,qBAAqB,GAAG,KAAK,GAAG,QAAQ,GAAG,QAAQ,GAAG,MAAM,CAAC;AAOzE,MAAM,MAAM,qBAAqB,GAAG,KAAK,GAAG,QAAQ,GAAG,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"CommonTypes.d.ts","sourceRoot":"","sources":["../../src/elements/CommonTypes.ts"],"names":[],"mappings":"AAyBA,MAAM,MAAM,cAAc,GAEtB,OAAO,GACP,OAAO,GAEP,YAAY,GACZ,YAAY,GACZ,mBAAmB,GACnB,YAAY,GAEZ,WAAW,GACX,WAAW,GAEX,gBAAgB,GAChB,gBAAgB,GAChB,uBAAuB,GACvB,gBAAgB,GAEhB,eAAe,GACf,eAAe,GAEf,MAAM,GACN,OAAO,GACP,OAAO,GACP,OAAO,GACP,OAAO,GACP,OAAO,GACP,OAAO,GACP,OAAO,GACP,OAAO,GACP,OAAO,GACP,OAAO,GACP,OAAO,GACP,OAAO,GACP,OAAO,GACP,OAAO,GACP,OAAO,GACP,OAAO,GACP,OAAO,GACP,OAAO,GACP,OAAO,GACP,OAAO,GACP,OAAO,GACP,OAAO,GACP,KAAK,CAAC;AAMV,MAAM,MAAM,mBAAmB,GAC3B,OAAO,GACP,OAAO,GACP,YAAY,GACZ,YAAY,GACZ,mBAAmB,GACnB,YAAY,GACZ,WAAW,GACX,WAAW,GACX,gBAAgB,GAChB,gBAAgB,GAChB,uBAAuB,GACvB,gBAAgB,GAChB,eAAe,GACf,eAAe,CAAC;AAYpB,MAAM,MAAM,WAAW,GACnB,MAAM,GACN,QAAQ,GACR,QAAQ,GACR,QAAQ,GACR,QAAQ,GACR,OAAO,CAAC;AAQZ,MAAM,MAAM,mBAAmB,GAC3B,WAAW,GACX,MAAM,GACN,gBAAgB,GAChB,cAAc,GACd,eAAe,CAAC;AAMpB,MAAM,MAAM,eAAe,GACvB,mBAAmB,GACnB,SAAS,GACT,YAAY,GACZ,QAAQ,GACR,mBAAmB,GACnB,mBAAmB,GACnB,uBAAuB,GACvB,oBAAoB,GACpB,oBAAoB,GACpB,wBAAwB,GACxB,mBAAmB,GACnB,mBAAmB,GACnB,uBAAuB,GACvB,cAAc,GACd,gBAAgB,GAChB,QAAQ,GACR,OAAO,CAAC;AAQZ,MAAM,WAAW,gBAAgB;IAE/B,KAAK,CAAC,EAAE,WAAW,GAAG,mBAAmB,CAAC;IAE1C,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAKD,MAAM,WAAW,gBAAgB;IAC/B,GAAG,CAAC,EAAE,gBAAgB,CAAC;IACvB,MAAM,CAAC,EAAE,gBAAgB,CAAC;IAC1B,IAAI,CAAC,EAAE,gBAAgB,CAAC;IACxB,KAAK,CAAC,EAAE,gBAAgB,CAAC;CAC1B;AAKD,MAAM,WAAW,sBAAuB,SAAQ,gBAAgB;IAE9D,OAAO,CAAC,EAAE,gBAAgB,CAAC;IAE3B,OAAO,CAAC,EAAE,gBAAgB,CAAC;CAC5B;AAWD,MAAM,MAAM,mBAAmB,GAC3B,MAAM,GACN,QAAQ,GACR,OAAO,GACP,QAAQ,GACR,SAAS,CAAC;AAOd,MAAM,MAAM,iBAAiB,GACzB,KAAK,GACL,QAAQ,GACR,QAAQ,GACR,QAAQ,GACR,SAAS,CAAC;AAOd,MAAM,MAAM,qBAAqB,GAAG,KAAK,GAAG,QAAQ,GAAG,QAAQ,GAAG,MAAM,CAAC;AAOzE,MAAM,MAAM,qBAAqB,GAAG,KAAK,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAShE,MAAM,MAAM,kBAAkB,GAC1B,MAAM,GACN,QAAQ,GACR,OAAO,GACP,SAAS,GACT,MAAM,GACN,OAAO,GACP,KAAK,GACL,YAAY,GACZ,eAAe,GACf,aAAa,GACb,YAAY,GACZ,gBAAgB,CAAC;AAQrB,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,GAAG,OAAO,GAAG,KAAK,CAAC;AAO3E,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,GAAG,OAAO,GAAG,KAAK,CAAC;AAO7E,MAAM,MAAM,qBAAqB,GAAG,KAAK,GAAG,QAAQ,GAAG,UAAU,GAAG,QAAQ,GAAG,MAAM,CAAC;AAOtF,MAAM,MAAM,YAAY,GACpB,OAAO,GACP,MAAM,GACN,QAAQ,GACR,OAAO,GACP,SAAS,GACT,KAAK,GACL,KAAK,CAAC;AAWV,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,QAAQ,GAAG,QAAQ,GAAG,WAAW,GAAG,WAAW,CAAC;AAOtF,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,QAAQ,GAAG,MAAM,CAAC;AAO1D,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,QAAQ,GAAG,MAAM,CAAC;AAYxD,MAAM,MAAM,aAAa,GACrB,MAAM,GACN,MAAM,GACN,MAAM,GACN,OAAO,GACP,OAAO,GACP,OAAO,CAAC;AAOZ,MAAM,MAAM,oBAAoB,GAAG,KAAK,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,CAAC;AAWnE,MAAM,MAAM,SAAS,GACjB,MAAM,GACN,KAAK,GACL,KAAK,CAAC;AAWV,MAAM,WAAW,aAAa;IAE5B,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,OAAO,CAAC,EAAE,cAAc,CAAC;IAEzB,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAWD,MAAM,MAAM,SAAS,GACjB,MAAM,GACN,KAAK,GACL,QAAQ,GACR,YAAY,GACZ,OAAO,GACP,WAAW,CAAC;AAOhB,MAAM,WAAW,OAAO;IAEtB,QAAQ,EAAE,MAAM,CAAC;IAEjB,SAAS,CAAC,EAAE,YAAY,CAAC;IAEzB,MAAM,CAAC,EAAE,SAAS,CAAC;CACpB;AASD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,cAAc,CA0CvE;AAKD,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,WAAW,CAEjE;AAKD,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,mBAAmB,CAEjF;AAKD,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,iBAAiB,CAE7E;AAKD,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,kBAAkB,CAe/E;AAKD,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,SAAS,CAE7D;AASD,eAAO,MAAM,cAAc,EAAE,gBAK5B,CAAC;AAKF,eAAO,MAAM,SAAS,EAAE,gBAKvB,CAAC;AAUF,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAarF"}
|
|
@@ -61,7 +61,20 @@ function isVerticalAlignment(value) {
|
|
|
61
61
|
return ['top', 'center', 'bottom', 'inside', 'outside'].includes(value);
|
|
62
62
|
}
|
|
63
63
|
function isParagraphAlignment(value) {
|
|
64
|
-
return [
|
|
64
|
+
return [
|
|
65
|
+
'left',
|
|
66
|
+
'center',
|
|
67
|
+
'right',
|
|
68
|
+
'justify',
|
|
69
|
+
'both',
|
|
70
|
+
'start',
|
|
71
|
+
'end',
|
|
72
|
+
'distribute',
|
|
73
|
+
'mediumKashida',
|
|
74
|
+
'highKashida',
|
|
75
|
+
'lowKashida',
|
|
76
|
+
'thaiDistribute',
|
|
77
|
+
].includes(value);
|
|
65
78
|
}
|
|
66
79
|
function isWidthType(value) {
|
|
67
80
|
return ['auto', 'dxa', 'pct'].includes(value);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CommonTypes.js","sourceRoot":"","sources":["../../src/elements/CommonTypes.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * CommonTypes - Consolidated type definitions for docxmlater elements\n *\n * This file consolidates duplicate type definitions that were scattered across multiple\n * element files (Paragraph.ts, Run.ts, Table.ts, TableCell.ts, TableRow.ts, Image.ts, Section.ts).\n *\n * Benefits:\n * - Single source of truth for shared types\n * - Consistent type definitions across all elements\n * - Easier maintenance and updates\n * - Better type safety when passing values between elements\n *\n * @module CommonTypes\n */\n\n// ============================================================================\n// SHADING PATTERNS\n// ============================================================================\n\n/**\n * Shading pattern types per ECMA-376 Part 1 Section 17.18.78 (ST_Shd)\n *\n * Consolidated from: Paragraph.ts, Run.ts, TableRow.ts, TableCell.ts\n * This is the complete set of shading patterns supported by Word.\n */\nexport type ShadingPattern =\n // Solid patterns\n | 'clear' // No pattern (transparent)\n | 'solid' // Solid fill\n // Stripe patterns\n | 'horzStripe' // Horizontal stripes\n | 'vertStripe' // Vertical stripes\n | 'reverseDiagStripe' // Reverse diagonal stripes (/)\n | 'diagStripe' // Diagonal stripes (\\)\n // Cross patterns\n | 'horzCross' // Horizontal cross-hatch\n | 'diagCross' // Diagonal cross-hatch\n // Thin stripe patterns\n | 'thinHorzStripe' // Thin horizontal stripes\n | 'thinVertStripe' // Thin vertical stripes\n | 'thinReverseDiagStripe' // Thin reverse diagonal stripes\n | 'thinDiagStripe' // Thin diagonal stripes\n // Thin cross patterns\n | 'thinHorzCross' // Thin horizontal cross-hatch\n | 'thinDiagCross' // Thin diagonal cross-hatch\n // Percentage fill patterns (5% increments with some extras)\n | 'pct5'\n | 'pct10'\n | 'pct12'\n | 'pct15'\n | 'pct20'\n | 'pct25'\n | 'pct30'\n | 'pct35'\n | 'pct37'\n | 'pct40'\n | 'pct45'\n | 'pct50'\n | 'pct55'\n | 'pct60'\n | 'pct62'\n | 'pct65'\n | 'pct70'\n | 'pct75'\n | 'pct80'\n | 'pct85'\n | 'pct87'\n | 'pct90'\n | 'pct95'\n | 'nil'; // Explicitly clear inherited shading (ECMA-376 §17.18.78)\n\n/**\n * Basic shading patterns (without percentage fills)\n * Use this for contexts where percentage patterns are not needed\n */\nexport type BasicShadingPattern =\n | 'clear'\n | 'solid'\n | 'horzStripe'\n | 'vertStripe'\n | 'reverseDiagStripe'\n | 'diagStripe'\n | 'horzCross'\n | 'diagCross'\n | 'thinHorzStripe'\n | 'thinVertStripe'\n | 'thinReverseDiagStripe'\n | 'thinDiagStripe'\n | 'thinHorzCross'\n | 'thinDiagCross';\n\n// ============================================================================\n// BORDER STYLES\n// ============================================================================\n\n/**\n * Basic border styles per ECMA-376 Part 1 Section 17.18.2 (ST_Border)\n *\n * Consolidated from: Paragraph.ts, TableCell.ts, Table.ts\n * This covers the most commonly used border styles.\n */\nexport type BorderStyle =\n | 'none' // No border\n | 'single' // Single line\n | 'double' // Double line\n | 'dashed' // Dashed line\n | 'dotted' // Dotted line\n | 'thick'; // Thick single line\n\n/**\n * Extended border styles including decorative effects\n *\n * Consolidated from: Run.ts (TextBorderStyle)\n * Includes 3D effects and other decorative styles.\n */\nexport type ExtendedBorderStyle =\n | BorderStyle\n | 'wave' // Wavy line\n | 'dashDotStroked' // Dash-dot stroked\n | 'threeDEmboss' // 3D embossed effect\n | 'threeDEngrave'; // 3D engraved effect\n\n/**\n * Full border style set per ECMA-376\n * Includes all possible border values from the spec.\n */\nexport type FullBorderStyle =\n | ExtendedBorderStyle\n | 'dotDash' // Dot-dash pattern\n | 'dotDotDash' // Dot-dot-dash pattern\n | 'triple' // Triple line\n | 'thinThickSmallGap'\n | 'thickThinSmallGap'\n | 'thinThickThinSmallGap'\n | 'thinThickMediumGap'\n | 'thickThinMediumGap'\n | 'thinThickThinMediumGap'\n | 'thinThickLargeGap'\n | 'thickThinLargeGap'\n | 'thinThickThinLargeGap'\n | 'dashSmallGap'\n | 'dashDotStroked'\n | 'outset'\n | 'inset';\n\n/**\n * Generic border definition interface\n *\n * Consolidated from: Paragraph.ts (BorderDefinition), Run.ts (TextBorder),\n * TableCell.ts (CellBorder), Table.ts (TableBorder)\n */\nexport interface BorderDefinition {\n /** Border style */\n style?: BorderStyle | ExtendedBorderStyle;\n /** Border width in eighths of a point (1-96) */\n size?: number;\n /** Border color in hex format (without #) */\n color?: string;\n /** Space between border and content in points (0-31) */\n space?: number;\n}\n\n/**\n * Four-sided border definitions\n */\nexport interface FourSidedBorders {\n top?: BorderDefinition;\n bottom?: BorderDefinition;\n left?: BorderDefinition;\n right?: BorderDefinition;\n}\n\n/**\n * Table border definitions (includes inside borders)\n */\nexport interface TableBorderDefinitions extends FourSidedBorders {\n /** Inside horizontal borders (between rows) */\n insideH?: BorderDefinition;\n /** Inside vertical borders (between columns) */\n insideV?: BorderDefinition;\n}\n\n// ============================================================================\n// ALIGNMENT TYPES\n// ============================================================================\n\n/**\n * Horizontal alignment for general use\n *\n * Consolidated from: Image.ts, Table.ts (TableHorizontalAlignment)\n */\nexport type HorizontalAlignment =\n | 'left'\n | 'center'\n | 'right'\n | 'inside' // Toward binding edge\n | 'outside'; // Away from binding edge\n\n/**\n * Vertical alignment for general use\n *\n * Consolidated from: Image.ts, Table.ts (TableVerticalAlignment)\n */\nexport type VerticalAlignment =\n | 'top'\n | 'center'\n | 'bottom'\n | 'inside' // Toward top of page in header\n | 'outside'; // Toward bottom of page in footer\n\n/**\n * Vertical alignment for page content (Section-level)\n *\n * From: Section.ts - includes 'both' for justified vertical alignment\n */\nexport type PageVerticalAlignment = 'top' | 'center' | 'bottom' | 'both';\n\n/**\n * Vertical alignment for table cells\n *\n * From: TableCell.ts (CellVerticalAlignment)\n */\nexport type CellVerticalAlignment = 'top' | 'center' | 'bottom';\n\n/**\n * Paragraph text alignment\n *\n * From: Paragraph.ts (ParagraphAlignment)\n * Note: 'both' is an alias for 'justify' in some contexts\n */\nexport type ParagraphAlignment = 'left' | 'center' | 'right' | 'justify' | 'both';\n\n/**\n * Table alignment (horizontal positioning)\n *\n * From: Table.ts (TableAlignment)\n */\nexport type TableAlignment = 'left' | 'center' | 'right';\n\n/**\n * Row justification/alignment options\n *\n * From: TableRow.ts (RowJustification)\n */\nexport type RowJustification = 'left' | 'center' | 'right' | 'start' | 'end';\n\n/**\n * Text vertical alignment within line/cell\n *\n * From: Paragraph.ts (TextAlignment)\n */\nexport type TextVerticalAlignment = 'top' | 'center' | 'baseline' | 'bottom' | 'auto';\n\n/**\n * Tab stop alignment types\n *\n * From: Paragraph.ts (TabAlignment)\n */\nexport type TabAlignment =\n | 'clear' // Remove tab stop\n | 'left' // Left-aligned\n | 'center' // Center-aligned\n | 'right' // Right-aligned\n | 'decimal' // Decimal-aligned (for numbers)\n | 'bar' // Bar tab (vertical line)\n | 'num'; // List number alignment\n\n// ============================================================================\n// POSITIONING & ANCHORING\n// ============================================================================\n\n/**\n * Position anchor type (what to position relative to)\n *\n * From: Image.ts (PositionAnchor)\n */\nexport type PositionAnchor = 'page' | 'margin' | 'column' | 'character' | 'paragraph';\n\n/**\n * Horizontal anchor for floating elements\n *\n * From: Table.ts (TableHorizontalAnchor), Paragraph.ts (FrameProperties.hAnchor)\n */\nexport type HorizontalAnchor = 'text' | 'margin' | 'page';\n\n/**\n * Vertical anchor for floating elements\n *\n * From: Table.ts (TableVerticalAnchor), Paragraph.ts (FrameProperties.vAnchor)\n */\nexport type VerticalAnchor = 'text' | 'margin' | 'page';\n\n// ============================================================================\n// TEXT DIRECTION\n// ============================================================================\n\n/**\n * Text direction for paragraphs and cells\n *\n * Consolidated from: Paragraph.ts, Section.ts\n * Per ECMA-376 Part 1 Section 17.18.93 (ST_TextDirection)\n */\nexport type TextDirection =\n | 'lrTb' // Left-to-right, top-to-bottom (Western default)\n | 'tbRl' // Top-to-bottom, right-to-left (East Asian vertical)\n | 'btLr' // Bottom-to-top, left-to-right\n | 'lrTbV' // Left-to-right, top-to-bottom (vertical variant)\n | 'tbRlV' // Top-to-bottom, right-to-left (vertical variant)\n | 'tbLrV'; // Top-to-bottom, left-to-right (vertical variant)\n\n/**\n * Simplified text direction for sections\n *\n * From: Section.ts\n */\nexport type SectionTextDirection = 'ltr' | 'rtl' | 'tbRl' | 'btLr';\n\n// ============================================================================\n// WIDTH TYPES\n// ============================================================================\n\n/**\n * Width type specification per ECMA-376\n *\n * Consolidated from: Table.ts, TableCell.ts\n */\nexport type WidthType =\n | 'auto' // Automatically determined\n | 'dxa' // Twips (twentieths of a point)\n | 'pct'; // Percentage (in fiftieths of a percent)\n\n// ============================================================================\n// SHADING CONFIGURATION\n// ============================================================================\n\n/**\n * Generic shading configuration\n *\n * Consolidated from: Run.ts (CharacterShading), TableRow.ts (Shading), TableCell.ts (CellShading)\n */\nexport interface ShadingConfig {\n /** Background fill color in hex format (without #), or \"auto\" to inherit from style/parent */\n fill?: string;\n /** Foreground/pattern color in hex format (without #), or \"auto\" to inherit from style/parent */\n color?: string;\n /** Shading pattern type (maps to w:val in XML) */\n pattern?: ShadingPattern;\n /** Theme fill color reference (e.g., \"accent1\") */\n themeFill?: string;\n /** Theme foreground color reference */\n themeColor?: string;\n /** Tint on theme fill (hex 00-FF) */\n themeFillTint?: string;\n /** Shade on theme fill (hex 00-FF) */\n themeFillShade?: string;\n /** Tint on theme color (hex 00-FF) */\n themeTint?: string;\n /** Shade on theme color (hex 00-FF) */\n themeShade?: string;\n}\n\n// ============================================================================\n// TAB STOPS\n// ============================================================================\n\n/**\n * Tab stop leader types\n *\n * From: Paragraph.ts (TabLeader)\n */\nexport type TabLeader =\n | 'none' // No leader\n | 'dot' // Dots ......\n | 'hyphen' // Hyphens ------\n | 'underscore' // Underscores ______\n | 'heavy' // Heavy line\n | 'middleDot'; // Middle dots\n\n/**\n * Tab stop definition\n *\n * From: Paragraph.ts (TabStop)\n */\nexport interface TabStop {\n /** Position in twips from left margin */\n position: number;\n /** Alignment type */\n alignment?: TabAlignment;\n /** Leader character type */\n leader?: TabLeader;\n}\n\n// ============================================================================\n// TYPE GUARDS\n// ============================================================================\n\n/**\n * Check if a value is a valid ShadingPattern\n */\nexport function isShadingPattern(value: string): value is ShadingPattern {\n const patterns = [\n 'clear',\n 'solid',\n 'horzStripe',\n 'vertStripe',\n 'reverseDiagStripe',\n 'diagStripe',\n 'horzCross',\n 'diagCross',\n 'thinHorzStripe',\n 'thinVertStripe',\n 'thinReverseDiagStripe',\n 'thinDiagStripe',\n 'thinHorzCross',\n 'thinDiagCross',\n 'pct5',\n 'pct10',\n 'pct12',\n 'pct15',\n 'pct20',\n 'pct25',\n 'pct30',\n 'pct35',\n 'pct37',\n 'pct40',\n 'pct45',\n 'pct50',\n 'pct55',\n 'pct60',\n 'pct62',\n 'pct65',\n 'pct70',\n 'pct75',\n 'pct80',\n 'pct85',\n 'pct87',\n 'pct90',\n 'pct95',\n 'nil',\n ];\n return patterns.includes(value);\n}\n\n/**\n * Check if a value is a valid BorderStyle\n */\nexport function isBorderStyle(value: string): value is BorderStyle {\n return ['none', 'single', 'double', 'dashed', 'dotted', 'thick'].includes(value);\n}\n\n/**\n * Check if a value is a valid HorizontalAlignment\n */\nexport function isHorizontalAlignment(value: string): value is HorizontalAlignment {\n return ['left', 'center', 'right', 'inside', 'outside'].includes(value);\n}\n\n/**\n * Check if a value is a valid VerticalAlignment\n */\nexport function isVerticalAlignment(value: string): value is VerticalAlignment {\n return ['top', 'center', 'bottom', 'inside', 'outside'].includes(value);\n}\n\n/**\n * Check if a value is a valid ParagraphAlignment\n */\nexport function isParagraphAlignment(value: string): value is ParagraphAlignment {\n return ['left', 'center', 'right', 'justify', 'both'].includes(value);\n}\n\n/**\n * Check if a value is a valid WidthType\n */\nexport function isWidthType(value: string): value is WidthType {\n return ['auto', 'dxa', 'pct'].includes(value);\n}\n\n// ============================================================================\n// CONSTANTS\n// ============================================================================\n\n/**\n * Default border definition\n */\nexport const DEFAULT_BORDER: BorderDefinition = {\n style: 'single',\n size: 4, // 0.5pt (4 eighths)\n color: '000000',\n space: 0,\n};\n\n/**\n * No border definition\n */\nexport const NO_BORDER: BorderDefinition = {\n style: 'none',\n size: 0,\n color: 'auto',\n space: 0,\n};\n\n// ============================================================================\n// SHADING UTILITIES\n// ============================================================================\n\n/**\n * Builds XML attributes for a w:shd element from a ShadingConfig.\n * Shared across all element types for consistent shading generation.\n */\nexport function buildShadingAttributes(shading: ShadingConfig): Record<string, string> {\n const attrs: Record<string, string> = {};\n // w:val is REQUIRED per ECMA-376 — default to \"clear\" if no pattern specified\n attrs['w:val'] = shading.pattern || 'clear';\n if (shading.fill) attrs['w:fill'] = shading.fill;\n if (shading.color) attrs['w:color'] = shading.color;\n if (shading.themeFill) attrs['w:themeFill'] = shading.themeFill;\n if (shading.themeColor) attrs['w:themeColor'] = shading.themeColor;\n if (shading.themeFillTint) attrs['w:themeFillTint'] = shading.themeFillTint;\n if (shading.themeFillShade) attrs['w:themeFillShade'] = shading.themeFillShade;\n if (shading.themeTint) attrs['w:themeTint'] = shading.themeTint;\n if (shading.themeShade) attrs['w:themeShade'] = shading.themeShade;\n return attrs;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"CommonTypes.js","sourceRoot":"","sources":["../../src/elements/CommonTypes.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * CommonTypes - Consolidated type definitions for docxmlater elements\n *\n * This file consolidates duplicate type definitions that were scattered across multiple\n * element files (Paragraph.ts, Run.ts, Table.ts, TableCell.ts, TableRow.ts, Image.ts, Section.ts).\n *\n * Benefits:\n * - Single source of truth for shared types\n * - Consistent type definitions across all elements\n * - Easier maintenance and updates\n * - Better type safety when passing values between elements\n *\n * @module CommonTypes\n */\n\n// ============================================================================\n// SHADING PATTERNS\n// ============================================================================\n\n/**\n * Shading pattern types per ECMA-376 Part 1 Section 17.18.78 (ST_Shd)\n *\n * Consolidated from: Paragraph.ts, Run.ts, TableRow.ts, TableCell.ts\n * This is the complete set of shading patterns supported by Word.\n */\nexport type ShadingPattern =\n // Solid patterns\n | 'clear' // No pattern (transparent)\n | 'solid' // Solid fill\n // Stripe patterns\n | 'horzStripe' // Horizontal stripes\n | 'vertStripe' // Vertical stripes\n | 'reverseDiagStripe' // Reverse diagonal stripes (/)\n | 'diagStripe' // Diagonal stripes (\\)\n // Cross patterns\n | 'horzCross' // Horizontal cross-hatch\n | 'diagCross' // Diagonal cross-hatch\n // Thin stripe patterns\n | 'thinHorzStripe' // Thin horizontal stripes\n | 'thinVertStripe' // Thin vertical stripes\n | 'thinReverseDiagStripe' // Thin reverse diagonal stripes\n | 'thinDiagStripe' // Thin diagonal stripes\n // Thin cross patterns\n | 'thinHorzCross' // Thin horizontal cross-hatch\n | 'thinDiagCross' // Thin diagonal cross-hatch\n // Percentage fill patterns (5% increments with some extras)\n | 'pct5'\n | 'pct10'\n | 'pct12'\n | 'pct15'\n | 'pct20'\n | 'pct25'\n | 'pct30'\n | 'pct35'\n | 'pct37'\n | 'pct40'\n | 'pct45'\n | 'pct50'\n | 'pct55'\n | 'pct60'\n | 'pct62'\n | 'pct65'\n | 'pct70'\n | 'pct75'\n | 'pct80'\n | 'pct85'\n | 'pct87'\n | 'pct90'\n | 'pct95'\n | 'nil'; // Explicitly clear inherited shading (ECMA-376 §17.18.78)\n\n/**\n * Basic shading patterns (without percentage fills)\n * Use this for contexts where percentage patterns are not needed\n */\nexport type BasicShadingPattern =\n | 'clear'\n | 'solid'\n | 'horzStripe'\n | 'vertStripe'\n | 'reverseDiagStripe'\n | 'diagStripe'\n | 'horzCross'\n | 'diagCross'\n | 'thinHorzStripe'\n | 'thinVertStripe'\n | 'thinReverseDiagStripe'\n | 'thinDiagStripe'\n | 'thinHorzCross'\n | 'thinDiagCross';\n\n// ============================================================================\n// BORDER STYLES\n// ============================================================================\n\n/**\n * Basic border styles per ECMA-376 Part 1 Section 17.18.2 (ST_Border)\n *\n * Consolidated from: Paragraph.ts, TableCell.ts, Table.ts\n * This covers the most commonly used border styles.\n */\nexport type BorderStyle =\n | 'none' // No border\n | 'single' // Single line\n | 'double' // Double line\n | 'dashed' // Dashed line\n | 'dotted' // Dotted line\n | 'thick'; // Thick single line\n\n/**\n * Extended border styles including decorative effects\n *\n * Consolidated from: Run.ts (TextBorderStyle)\n * Includes 3D effects and other decorative styles.\n */\nexport type ExtendedBorderStyle =\n | BorderStyle\n | 'wave' // Wavy line\n | 'dashDotStroked' // Dash-dot stroked\n | 'threeDEmboss' // 3D embossed effect\n | 'threeDEngrave'; // 3D engraved effect\n\n/**\n * Full border style set per ECMA-376\n * Includes all possible border values from the spec.\n */\nexport type FullBorderStyle =\n | ExtendedBorderStyle\n | 'dotDash' // Dot-dash pattern\n | 'dotDotDash' // Dot-dot-dash pattern\n | 'triple' // Triple line\n | 'thinThickSmallGap'\n | 'thickThinSmallGap'\n | 'thinThickThinSmallGap'\n | 'thinThickMediumGap'\n | 'thickThinMediumGap'\n | 'thinThickThinMediumGap'\n | 'thinThickLargeGap'\n | 'thickThinLargeGap'\n | 'thinThickThinLargeGap'\n | 'dashSmallGap'\n | 'dashDotStroked'\n | 'outset'\n | 'inset';\n\n/**\n * Generic border definition interface\n *\n * Consolidated from: Paragraph.ts (BorderDefinition), Run.ts (TextBorder),\n * TableCell.ts (CellBorder), Table.ts (TableBorder)\n */\nexport interface BorderDefinition {\n /** Border style */\n style?: BorderStyle | ExtendedBorderStyle;\n /** Border width in eighths of a point (1-96) */\n size?: number;\n /** Border color in hex format (without #) */\n color?: string;\n /** Space between border and content in points (0-31) */\n space?: number;\n}\n\n/**\n * Four-sided border definitions\n */\nexport interface FourSidedBorders {\n top?: BorderDefinition;\n bottom?: BorderDefinition;\n left?: BorderDefinition;\n right?: BorderDefinition;\n}\n\n/**\n * Table border definitions (includes inside borders)\n */\nexport interface TableBorderDefinitions extends FourSidedBorders {\n /** Inside horizontal borders (between rows) */\n insideH?: BorderDefinition;\n /** Inside vertical borders (between columns) */\n insideV?: BorderDefinition;\n}\n\n// ============================================================================\n// ALIGNMENT TYPES\n// ============================================================================\n\n/**\n * Horizontal alignment for general use\n *\n * Consolidated from: Image.ts, Table.ts (TableHorizontalAlignment)\n */\nexport type HorizontalAlignment =\n | 'left'\n | 'center'\n | 'right'\n | 'inside' // Toward binding edge\n | 'outside'; // Away from binding edge\n\n/**\n * Vertical alignment for general use\n *\n * Consolidated from: Image.ts, Table.ts (TableVerticalAlignment)\n */\nexport type VerticalAlignment =\n | 'top'\n | 'center'\n | 'bottom'\n | 'inside' // Toward top of page in header\n | 'outside'; // Toward bottom of page in footer\n\n/**\n * Vertical alignment for page content (Section-level)\n *\n * From: Section.ts - includes 'both' for justified vertical alignment\n */\nexport type PageVerticalAlignment = 'top' | 'center' | 'bottom' | 'both';\n\n/**\n * Vertical alignment for table cells\n *\n * From: TableCell.ts (CellVerticalAlignment)\n */\nexport type CellVerticalAlignment = 'top' | 'center' | 'bottom';\n\n/**\n * Paragraph text alignment per ECMA-376 §17.18.44 (ST_Jc)\n *\n * From: Paragraph.ts (ParagraphAlignment)\n * Note: 'both' is the OOXML name for justified text; 'justify' is accepted as an alias.\n * 'start'/'end' are bidi-aware alternatives to 'left'/'right'.\n */\nexport type ParagraphAlignment =\n | 'left'\n | 'center'\n | 'right'\n | 'justify'\n | 'both'\n | 'start'\n | 'end'\n | 'distribute'\n | 'mediumKashida'\n | 'highKashida'\n | 'lowKashida'\n | 'thaiDistribute';\n\n/**\n * Table alignment (horizontal positioning) per ECMA-376 §17.18.45 (ST_JcTable)\n *\n * From: Table.ts (TableAlignment)\n * 'start'/'end' are bidi-aware alternatives to 'left'/'right'.\n */\nexport type TableAlignment = 'left' | 'center' | 'right' | 'start' | 'end';\n\n/**\n * Row justification/alignment options\n *\n * From: TableRow.ts (RowJustification)\n */\nexport type RowJustification = 'left' | 'center' | 'right' | 'start' | 'end';\n\n/**\n * Text vertical alignment within line/cell\n *\n * From: Paragraph.ts (TextAlignment)\n */\nexport type TextVerticalAlignment = 'top' | 'center' | 'baseline' | 'bottom' | 'auto';\n\n/**\n * Tab stop alignment types\n *\n * From: Paragraph.ts (TabAlignment)\n */\nexport type TabAlignment =\n | 'clear' // Remove tab stop\n | 'left' // Left-aligned\n | 'center' // Center-aligned\n | 'right' // Right-aligned\n | 'decimal' // Decimal-aligned (for numbers)\n | 'bar' // Bar tab (vertical line)\n | 'num'; // List number alignment\n\n// ============================================================================\n// POSITIONING & ANCHORING\n// ============================================================================\n\n/**\n * Position anchor type (what to position relative to)\n *\n * From: Image.ts (PositionAnchor)\n */\nexport type PositionAnchor = 'page' | 'margin' | 'column' | 'character' | 'paragraph';\n\n/**\n * Horizontal anchor for floating elements\n *\n * From: Table.ts (TableHorizontalAnchor), Paragraph.ts (FrameProperties.hAnchor)\n */\nexport type HorizontalAnchor = 'text' | 'margin' | 'page';\n\n/**\n * Vertical anchor for floating elements\n *\n * From: Table.ts (TableVerticalAnchor), Paragraph.ts (FrameProperties.vAnchor)\n */\nexport type VerticalAnchor = 'text' | 'margin' | 'page';\n\n// ============================================================================\n// TEXT DIRECTION\n// ============================================================================\n\n/**\n * Text direction for paragraphs and cells\n *\n * Consolidated from: Paragraph.ts, Section.ts\n * Per ECMA-376 Part 1 Section 17.18.93 (ST_TextDirection)\n */\nexport type TextDirection =\n | 'lrTb' // Left-to-right, top-to-bottom (Western default)\n | 'tbRl' // Top-to-bottom, right-to-left (East Asian vertical)\n | 'btLr' // Bottom-to-top, left-to-right\n | 'lrTbV' // Left-to-right, top-to-bottom (vertical variant)\n | 'tbRlV' // Top-to-bottom, right-to-left (vertical variant)\n | 'tbLrV'; // Top-to-bottom, left-to-right (vertical variant)\n\n/**\n * Simplified text direction for sections\n *\n * From: Section.ts\n */\nexport type SectionTextDirection = 'ltr' | 'rtl' | 'tbRl' | 'btLr';\n\n// ============================================================================\n// WIDTH TYPES\n// ============================================================================\n\n/**\n * Width type specification per ECMA-376\n *\n * Consolidated from: Table.ts, TableCell.ts\n */\nexport type WidthType =\n | 'auto' // Automatically determined\n | 'dxa' // Twips (twentieths of a point)\n | 'pct'; // Percentage (in fiftieths of a percent)\n\n// ============================================================================\n// SHADING CONFIGURATION\n// ============================================================================\n\n/**\n * Generic shading configuration\n *\n * Consolidated from: Run.ts (CharacterShading), TableRow.ts (Shading), TableCell.ts (CellShading)\n */\nexport interface ShadingConfig {\n /** Background fill color in hex format (without #), or \"auto\" to inherit from style/parent */\n fill?: string;\n /** Foreground/pattern color in hex format (without #), or \"auto\" to inherit from style/parent */\n color?: string;\n /** Shading pattern type (maps to w:val in XML) */\n pattern?: ShadingPattern;\n /** Theme fill color reference (e.g., \"accent1\") */\n themeFill?: string;\n /** Theme foreground color reference */\n themeColor?: string;\n /** Tint on theme fill (hex 00-FF) */\n themeFillTint?: string;\n /** Shade on theme fill (hex 00-FF) */\n themeFillShade?: string;\n /** Tint on theme color (hex 00-FF) */\n themeTint?: string;\n /** Shade on theme color (hex 00-FF) */\n themeShade?: string;\n}\n\n// ============================================================================\n// TAB STOPS\n// ============================================================================\n\n/**\n * Tab stop leader types\n *\n * From: Paragraph.ts (TabLeader)\n */\nexport type TabLeader =\n | 'none' // No leader\n | 'dot' // Dots ......\n | 'hyphen' // Hyphens ------\n | 'underscore' // Underscores ______\n | 'heavy' // Heavy line\n | 'middleDot'; // Middle dots\n\n/**\n * Tab stop definition\n *\n * From: Paragraph.ts (TabStop)\n */\nexport interface TabStop {\n /** Position in twips from left margin */\n position: number;\n /** Alignment type */\n alignment?: TabAlignment;\n /** Leader character type */\n leader?: TabLeader;\n}\n\n// ============================================================================\n// TYPE GUARDS\n// ============================================================================\n\n/**\n * Check if a value is a valid ShadingPattern\n */\nexport function isShadingPattern(value: string): value is ShadingPattern {\n const patterns = [\n 'clear',\n 'solid',\n 'horzStripe',\n 'vertStripe',\n 'reverseDiagStripe',\n 'diagStripe',\n 'horzCross',\n 'diagCross',\n 'thinHorzStripe',\n 'thinVertStripe',\n 'thinReverseDiagStripe',\n 'thinDiagStripe',\n 'thinHorzCross',\n 'thinDiagCross',\n 'pct5',\n 'pct10',\n 'pct12',\n 'pct15',\n 'pct20',\n 'pct25',\n 'pct30',\n 'pct35',\n 'pct37',\n 'pct40',\n 'pct45',\n 'pct50',\n 'pct55',\n 'pct60',\n 'pct62',\n 'pct65',\n 'pct70',\n 'pct75',\n 'pct80',\n 'pct85',\n 'pct87',\n 'pct90',\n 'pct95',\n 'nil',\n ];\n return patterns.includes(value);\n}\n\n/**\n * Check if a value is a valid BorderStyle\n */\nexport function isBorderStyle(value: string): value is BorderStyle {\n return ['none', 'single', 'double', 'dashed', 'dotted', 'thick'].includes(value);\n}\n\n/**\n * Check if a value is a valid HorizontalAlignment\n */\nexport function isHorizontalAlignment(value: string): value is HorizontalAlignment {\n return ['left', 'center', 'right', 'inside', 'outside'].includes(value);\n}\n\n/**\n * Check if a value is a valid VerticalAlignment\n */\nexport function isVerticalAlignment(value: string): value is VerticalAlignment {\n return ['top', 'center', 'bottom', 'inside', 'outside'].includes(value);\n}\n\n/**\n * Check if a value is a valid ParagraphAlignment\n */\nexport function isParagraphAlignment(value: string): value is ParagraphAlignment {\n return [\n 'left',\n 'center',\n 'right',\n 'justify',\n 'both',\n 'start',\n 'end',\n 'distribute',\n 'mediumKashida',\n 'highKashida',\n 'lowKashida',\n 'thaiDistribute',\n ].includes(value);\n}\n\n/**\n * Check if a value is a valid WidthType\n */\nexport function isWidthType(value: string): value is WidthType {\n return ['auto', 'dxa', 'pct'].includes(value);\n}\n\n// ============================================================================\n// CONSTANTS\n// ============================================================================\n\n/**\n * Default border definition\n */\nexport const DEFAULT_BORDER: BorderDefinition = {\n style: 'single',\n size: 4, // 0.5pt (4 eighths)\n color: '000000',\n space: 0,\n};\n\n/**\n * No border definition\n */\nexport const NO_BORDER: BorderDefinition = {\n style: 'none',\n size: 0,\n color: 'auto',\n space: 0,\n};\n\n// ============================================================================\n// SHADING UTILITIES\n// ============================================================================\n\n/**\n * Builds XML attributes for a w:shd element from a ShadingConfig.\n * Shared across all element types for consistent shading generation.\n */\nexport function buildShadingAttributes(shading: ShadingConfig): Record<string, string> {\n const attrs: Record<string, string> = {};\n // w:val is REQUIRED per ECMA-376 — default to \"clear\" if no pattern specified\n attrs['w:val'] = shading.pattern || 'clear';\n if (shading.fill) attrs['w:fill'] = shading.fill;\n if (shading.color) attrs['w:color'] = shading.color;\n if (shading.themeFill) attrs['w:themeFill'] = shading.themeFill;\n if (shading.themeColor) attrs['w:themeColor'] = shading.themeColor;\n if (shading.themeFillTint) attrs['w:themeFillTint'] = shading.themeFillTint;\n if (shading.themeFillShade) attrs['w:themeFillShade'] = shading.themeFillShade;\n if (shading.themeTint) attrs['w:themeTint'] = shading.themeTint;\n if (shading.themeShade) attrs['w:themeShade'] = shading.themeShade;\n return attrs;\n}\n"]}
|
package/dist/elements/Field.d.ts
CHANGED
|
@@ -36,7 +36,7 @@ export declare class Field {
|
|
|
36
36
|
static createTitle(formatting?: RunFormatting): Field;
|
|
37
37
|
static createSectionPages(formatting?: RunFormatting): Field;
|
|
38
38
|
static createRef(bookmark: string, format?: string, formatting?: RunFormatting): Field;
|
|
39
|
-
static createHyperlink(url: string,
|
|
39
|
+
static createHyperlink(url: string, _displayText?: string, tooltip?: string, formatting?: RunFormatting): Field;
|
|
40
40
|
static createSeq(identifier: string, format?: string, formatting?: RunFormatting): Field;
|
|
41
41
|
static createTCEntry(text: string, level?: number, formatting?: RunFormatting): Field;
|
|
42
42
|
static createXEEntry(text: string, subEntry?: string, formatting?: RunFormatting): Field;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Field.d.ts","sourceRoot":"","sources":["../../src/elements/Field.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AACrD,OAAO,EACL,0BAA0B,EAG3B,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAM3C,MAAM,MAAM,SAAS,GACjB,MAAM,GACN,UAAU,GACV,MAAM,GACN,MAAM,GACN,QAAQ,GACR,OAAO,GACP,UAAU,GACV,kBAAkB,GAClB,SAAS,GACT,UAAU,GACV,YAAY,GACZ,UAAU,GACV,WAAW,GACX,cAAc,GACd,SAAS,GACT,KAAK,GACL,WAAW,GACX,KAAK,GACL,IAAI,GACJ,IAAI,GACJ,IAAI,GACJ,YAAY,GACZ,SAAS,GACT,aAAa,GACb,QAAQ,CAAC;AAKb,MAAM,WAAW,eAAe;IAE9B,IAAI,EAAE,SAAS,CAAC;IAEhB,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAE7B,UAAU,CAAC,EAAE,aAAa,CAAC;CAC5B;AAKD,qBAAa,KAAK;IAChB,OAAO,CAAC,IAAI,CAAY;IACxB,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,UAAU,CAAC,CAAgB;gBAMvB,UAAU,EAAE,eAAe;IAevC,OAAO,CAAC,gBAAgB;IAsBxB,OAAO,CAAC,WAAW;IAOnB,OAAO,IAAI,SAAS;IAOpB,cAAc,IAAI,MAAM;IAOxB,aAAa,CAAC,UAAU,EAAE,aAAa,GAAG,IAAI;IAQ9C,aAAa,IAAI,aAAa,GAAG,SAAS;IAQ1C,gBAAgB,IAAI,OAAO;IAW3B,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAc7B,KAAK,IAAI,UAAU;IA4BnB,OAAO,CAAC,kBAAkB;IAgD1B,OAAO,CAAC,mBAAmB;IAkF3B,MAAM,CAAC,gBAAgB,CAAC,UAAU,CAAC,EAAE,aAAa,GAAG,KAAK;IAW1D,MAAM,CAAC,gBAAgB,CAAC,UAAU,CAAC,EAAE,aAAa,GAAG,KAAK;IAY1D,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,aAAa,GAAG,KAAK;IAarE,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,aAAa,GAAG,KAAK;IAarE,MAAM,CAAC,cAAc,CAAC,WAAW,UAAQ,EAAE,UAAU,CAAC,EAAE,aAAa,GAAG,KAAK;IAW7E,MAAM,CAAC,YAAY,CAAC,UAAU,CAAC,EAAE,aAAa,GAAG,KAAK;IAWtD,MAAM,CAAC,WAAW,CAAC,UAAU,CAAC,EAAE,aAAa,GAAG,KAAK;IAWrD,MAAM,CAAC,kBAAkB,CAAC,UAAU,CAAC,EAAE,aAAa,GAAG,KAAK;IAa5D,MAAM,CAAC,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,aAAa,GAAG,KAAK;IAkBtF,MAAM,CAAC,eAAe,CACpB,GAAG,EAAE,MAAM,EACX,
|
|
1
|
+
{"version":3,"file":"Field.d.ts","sourceRoot":"","sources":["../../src/elements/Field.ts"],"names":[],"mappings":"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"}
|
package/dist/elements/Field.js
CHANGED
|
@@ -245,7 +245,7 @@ class Field {
|
|
|
245
245
|
formatting,
|
|
246
246
|
});
|
|
247
247
|
}
|
|
248
|
-
static createHyperlink(url,
|
|
248
|
+
static createHyperlink(url, _displayText = url, tooltip, formatting) {
|
|
249
249
|
let instruction = `HYPERLINK "${url}"`;
|
|
250
250
|
if (tooltip) {
|
|
251
251
|
instruction += ` \\o "${tooltip}"`;
|