@crypto512/jicon-mcp 0.7.1 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (129) hide show
  1. package/README.md +128 -395
  2. package/TOOL_LIST.md +810 -120
  3. package/dist/config/constants.d.ts +1 -0
  4. package/dist/config/constants.d.ts.map +1 -1
  5. package/dist/config/constants.js +1 -0
  6. package/dist/config/constants.js.map +1 -1
  7. package/dist/config/loader.d.ts +1 -0
  8. package/dist/config/loader.d.ts.map +1 -1
  9. package/dist/config/loader.js +27 -1
  10. package/dist/config/loader.js.map +1 -1
  11. package/dist/config/types.d.ts +8 -0
  12. package/dist/config/types.d.ts.map +1 -1
  13. package/dist/config/types.js +2 -0
  14. package/dist/config/types.js.map +1 -1
  15. package/dist/confluence/client.d.ts +38 -0
  16. package/dist/confluence/client.d.ts.map +1 -1
  17. package/dist/confluence/client.js +117 -0
  18. package/dist/confluence/client.js.map +1 -1
  19. package/dist/confluence/tools.d.ts +102 -75
  20. package/dist/confluence/tools.d.ts.map +1 -1
  21. package/dist/confluence/tools.js +510 -151
  22. package/dist/confluence/tools.js.map +1 -1
  23. package/dist/confluence/types.d.ts +55 -1
  24. package/dist/confluence/types.d.ts.map +1 -1
  25. package/dist/index.js +88 -2
  26. package/dist/index.js.map +1 -1
  27. package/dist/jira/tools.d.ts +0 -5
  28. package/dist/jira/tools.d.ts.map +1 -1
  29. package/dist/jira/tools.js +40 -87
  30. package/dist/jira/tools.js.map +1 -1
  31. package/dist/permissions/filter.d.ts +5 -0
  32. package/dist/permissions/filter.d.ts.map +1 -1
  33. package/dist/permissions/filter.js +29 -12
  34. package/dist/permissions/filter.js.map +1 -1
  35. package/dist/permissions/tool-registry.d.ts +23 -25
  36. package/dist/permissions/tool-registry.d.ts.map +1 -1
  37. package/dist/permissions/tool-registry.js +41 -45
  38. package/dist/permissions/tool-registry.js.map +1 -1
  39. package/dist/permissions/write-home-validator.d.ts +35 -0
  40. package/dist/permissions/write-home-validator.d.ts.map +1 -0
  41. package/dist/permissions/write-home-validator.js +140 -0
  42. package/dist/permissions/write-home-validator.js.map +1 -0
  43. package/dist/tempo/tools.d.ts.map +1 -1
  44. package/dist/tempo/tools.js +43 -44
  45. package/dist/tempo/tools.js.map +1 -1
  46. package/dist/utils/buffer-tools.d.ts +119 -1
  47. package/dist/utils/buffer-tools.d.ts.map +1 -1
  48. package/dist/utils/buffer-tools.js +610 -3
  49. package/dist/utils/buffer-tools.js.map +1 -1
  50. package/dist/utils/content-buffer.d.ts +34 -0
  51. package/dist/utils/content-buffer.d.ts.map +1 -1
  52. package/dist/utils/content-buffer.js +79 -0
  53. package/dist/utils/content-buffer.js.map +1 -1
  54. package/dist/utils/http-client.d.ts.map +1 -1
  55. package/dist/utils/http-client.js +4 -4
  56. package/dist/utils/http-client.js.map +1 -1
  57. package/dist/utils/jicon-help.d.ts +29 -0
  58. package/dist/utils/jicon-help.d.ts.map +1 -0
  59. package/dist/utils/jicon-help.js +873 -0
  60. package/dist/utils/jicon-help.js.map +1 -0
  61. package/dist/utils/plantuml/client.d.ts +40 -0
  62. package/dist/utils/plantuml/client.d.ts.map +1 -0
  63. package/dist/utils/plantuml/client.js +306 -0
  64. package/dist/utils/plantuml/client.js.map +1 -0
  65. package/dist/utils/plantuml/docker-manager.d.ts +35 -0
  66. package/dist/utils/plantuml/docker-manager.d.ts.map +1 -0
  67. package/dist/utils/plantuml/docker-manager.js +280 -0
  68. package/dist/utils/plantuml/docker-manager.js.map +1 -0
  69. package/dist/utils/plantuml/index.d.ts +11 -0
  70. package/dist/utils/plantuml/index.d.ts.map +1 -0
  71. package/dist/utils/plantuml/index.js +16 -0
  72. package/dist/utils/plantuml/index.js.map +1 -0
  73. package/dist/utils/plantuml/service.d.ts +46 -0
  74. package/dist/utils/plantuml/service.d.ts.map +1 -0
  75. package/dist/utils/plantuml/service.js +96 -0
  76. package/dist/utils/plantuml/service.js.map +1 -0
  77. package/dist/utils/plantuml/tools.d.ts +65 -0
  78. package/dist/utils/plantuml/tools.d.ts.map +1 -0
  79. package/dist/utils/plantuml/tools.js +272 -0
  80. package/dist/utils/plantuml/tools.js.map +1 -0
  81. package/dist/utils/plantuml/types.d.ts +130 -0
  82. package/dist/utils/plantuml/types.d.ts.map +1 -0
  83. package/dist/utils/plantuml/types.js +66 -0
  84. package/dist/utils/plantuml/types.js.map +1 -0
  85. package/dist/utils/response-formatter.d.ts +14 -0
  86. package/dist/utils/response-formatter.d.ts.map +1 -1
  87. package/dist/utils/response-formatter.js +84 -1
  88. package/dist/utils/response-formatter.js.map +1 -1
  89. package/dist/utils/url-tools.d.ts +49 -0
  90. package/dist/utils/url-tools.d.ts.map +1 -0
  91. package/dist/utils/url-tools.js +141 -0
  92. package/dist/utils/url-tools.js.map +1 -0
  93. package/dist/utils/xhtml/confluence-schema.d.ts +55 -0
  94. package/dist/utils/xhtml/confluence-schema.d.ts.map +1 -0
  95. package/dist/utils/xhtml/confluence-schema.js +215 -0
  96. package/dist/utils/xhtml/confluence-schema.js.map +1 -0
  97. package/dist/utils/xhtml/index.d.ts +17 -0
  98. package/dist/utils/xhtml/index.d.ts.map +1 -0
  99. package/dist/utils/xhtml/index.js +21 -0
  100. package/dist/utils/xhtml/index.js.map +1 -0
  101. package/dist/utils/xhtml/operations.d.ts +100 -0
  102. package/dist/utils/xhtml/operations.d.ts.map +1 -0
  103. package/dist/utils/xhtml/operations.js +596 -0
  104. package/dist/utils/xhtml/operations.js.map +1 -0
  105. package/dist/utils/xhtml/parser.d.ts +64 -0
  106. package/dist/utils/xhtml/parser.d.ts.map +1 -0
  107. package/dist/utils/xhtml/parser.js +180 -0
  108. package/dist/utils/xhtml/parser.js.map +1 -0
  109. package/dist/utils/xhtml/plantuml.d.ts +112 -0
  110. package/dist/utils/xhtml/plantuml.d.ts.map +1 -0
  111. package/dist/utils/xhtml/plantuml.js +251 -0
  112. package/dist/utils/xhtml/plantuml.js.map +1 -0
  113. package/dist/utils/xhtml/selector.d.ts +35 -0
  114. package/dist/utils/xhtml/selector.d.ts.map +1 -0
  115. package/dist/utils/xhtml/selector.js +358 -0
  116. package/dist/utils/xhtml/selector.js.map +1 -0
  117. package/dist/utils/xhtml/serializer.d.ts +26 -0
  118. package/dist/utils/xhtml/serializer.d.ts.map +1 -0
  119. package/dist/utils/xhtml/serializer.js +170 -0
  120. package/dist/utils/xhtml/serializer.js.map +1 -0
  121. package/dist/utils/xhtml/types.d.ts +134 -0
  122. package/dist/utils/xhtml/types.d.ts.map +1 -0
  123. package/dist/utils/xhtml/types.js +65 -0
  124. package/dist/utils/xhtml/types.js.map +1 -0
  125. package/dist/utils/xhtml/validator.d.ts +67 -0
  126. package/dist/utils/xhtml/validator.d.ts.map +1 -0
  127. package/dist/utils/xhtml/validator.js +300 -0
  128. package/dist/utils/xhtml/validator.js.map +1 -0
  129. package/package.json +5 -1
@@ -0,0 +1,596 @@
1
+ /**
2
+ * XHTML DOM Operations
3
+ *
4
+ * Implements insert, update, remove, move, and wrap operations
5
+ * for Confluence storage format manipulation.
6
+ */
7
+ import { parseXhtml, getContentRoot } from "./parser.js";
8
+ import { querySelector, findUnsupportedPseudo } from "./selector.js";
9
+ /**
10
+ * Create helpful error message for selector matching failures
11
+ */
12
+ function getSelectorErrorDetails(selector) {
13
+ const unsupported = findUnsupportedPseudo(selector);
14
+ if (unsupported) {
15
+ return {
16
+ hint: `Pseudo-selector ':${unsupported}' is not supported. Use ':contains("text")' to find elements by text content, or use tag/attribute selectors with matchIndex.`,
17
+ };
18
+ }
19
+ return {
20
+ hint: "Use tag selectors ('h1', 'table'), attribute selectors ('[class=\"title\"]'), or ':contains(\"text\")' to find elements.",
21
+ };
22
+ }
23
+ /**
24
+ * Resolve a semantic position to a selector and position
25
+ *
26
+ * @param document - The parsed XHTML document
27
+ * @param semanticPosition - The semantic position to resolve
28
+ * @returns Resolved selector and position, or null if not found
29
+ */
30
+ export function resolveSemanticPosition(document, semanticPosition) {
31
+ const root = getContentRoot(document);
32
+ if (!root)
33
+ return null;
34
+ switch (semanticPosition) {
35
+ case "after-title": {
36
+ // Find first h1 or h2
37
+ const h1Result = querySelector(document, "h1");
38
+ if (h1Result.matches.length > 0) {
39
+ return {
40
+ selector: "h1",
41
+ position: "after",
42
+ element: h1Result.matches[0].element,
43
+ };
44
+ }
45
+ const h2Result = querySelector(document, "h2");
46
+ if (h2Result.matches.length > 0) {
47
+ return {
48
+ selector: "h2",
49
+ position: "after",
50
+ element: h2Result.matches[0].element,
51
+ };
52
+ }
53
+ // No title found - fall back to before-content
54
+ return resolveSemanticPosition(document, "before-content");
55
+ }
56
+ case "after-heading": {
57
+ // Find first heading (h1-h6)
58
+ for (let level = 1; level <= 6; level++) {
59
+ const result = querySelector(document, `h${level}`);
60
+ if (result.matches.length > 0) {
61
+ return {
62
+ selector: `h${level}`,
63
+ position: "after",
64
+ element: result.matches[0].element,
65
+ };
66
+ }
67
+ }
68
+ // No heading found - fall back to before-content
69
+ return resolveSemanticPosition(document, "before-content");
70
+ }
71
+ case "before-content": {
72
+ // Insert at the start of the document body
73
+ // Find the first child element of the root
74
+ const firstChild = root.firstElementChild;
75
+ if (firstChild) {
76
+ return {
77
+ selector: firstChild.tagName.toLowerCase(),
78
+ position: "before",
79
+ element: firstChild,
80
+ };
81
+ }
82
+ // Empty document - insert inside root
83
+ return {
84
+ selector: root.tagName.toLowerCase(),
85
+ position: "inside-start",
86
+ element: root,
87
+ };
88
+ }
89
+ case "end": {
90
+ // Insert at the end of the document
91
+ const lastChild = root.lastElementChild;
92
+ if (lastChild) {
93
+ return {
94
+ selector: lastChild.tagName.toLowerCase(),
95
+ position: "after",
96
+ element: lastChild,
97
+ };
98
+ }
99
+ // Empty document - insert inside root
100
+ return {
101
+ selector: root.tagName.toLowerCase(),
102
+ position: "inside-end",
103
+ element: root,
104
+ };
105
+ }
106
+ case "after-toc": {
107
+ // Find table of contents macro
108
+ const tocResult = querySelector(document, 'ac:structured-macro[ac:name="toc"]');
109
+ if (tocResult.matches.length > 0) {
110
+ return {
111
+ selector: 'ac:structured-macro[ac:name="toc"]',
112
+ position: "after",
113
+ element: tocResult.matches[0].element,
114
+ };
115
+ }
116
+ // No TOC found - fall back to after-title
117
+ return resolveSemanticPosition(document, "after-title");
118
+ }
119
+ default:
120
+ return null;
121
+ }
122
+ }
123
+ /**
124
+ * Get the elements to operate on based on matchIndex/matchAll settings
125
+ */
126
+ function getTargetElements(context) {
127
+ const { matches, matchIndex, matchAll } = context;
128
+ if (matches.length === 0) {
129
+ return {
130
+ elements: [],
131
+ error: {
132
+ error: true,
133
+ message: "No elements match the selector",
134
+ details: { matchCount: 0 },
135
+ },
136
+ };
137
+ }
138
+ if (matchAll) {
139
+ return { elements: matches.map((m) => m.element) };
140
+ }
141
+ if (matchIndex !== undefined) {
142
+ if (matchIndex < 0 || matchIndex >= matches.length) {
143
+ return {
144
+ elements: [],
145
+ error: {
146
+ error: true,
147
+ message: `matchIndex ${matchIndex} out of range (${matches.length} matches found)`,
148
+ details: { matchCount: matches.length },
149
+ },
150
+ };
151
+ }
152
+ return { elements: [matches[matchIndex].element] };
153
+ }
154
+ // No matchIndex or matchAll - require unique match
155
+ if (matches.length > 1) {
156
+ return {
157
+ elements: [],
158
+ error: {
159
+ error: true,
160
+ message: `Selector matches ${matches.length} elements. Specify matchIndex or use matchAll=true`,
161
+ details: { matchCount: matches.length },
162
+ },
163
+ };
164
+ }
165
+ return { elements: [matches[0].element] };
166
+ }
167
+ /**
168
+ * Parse content string into DOM nodes
169
+ */
170
+ function parseContent(document, content) {
171
+ // Parse the content as XHTML
172
+ const result = parseXhtml(content);
173
+ if (!result.document) {
174
+ throw new Error(`Invalid XHTML content: ${result.error?.message}`);
175
+ }
176
+ const root = getContentRoot(result.document);
177
+ if (!root) {
178
+ return [];
179
+ }
180
+ // Import nodes into the target document
181
+ const nodes = [];
182
+ for (const child of root.childNodes) {
183
+ // Clone and import the node
184
+ const imported = document.importNode(child, true);
185
+ nodes.push(imported);
186
+ }
187
+ return nodes;
188
+ }
189
+ /**
190
+ * Insert content relative to a target element
191
+ */
192
+ function insertContent(element, position, nodes) {
193
+ const parent = element.parentNode;
194
+ if (!parent && (position === "before" || position === "after")) {
195
+ throw new Error("Cannot insert before/after root element");
196
+ }
197
+ switch (position) {
198
+ case "before":
199
+ for (const node of nodes) {
200
+ parent.insertBefore(node, element);
201
+ }
202
+ break;
203
+ case "after":
204
+ const nextSibling = element.nextSibling;
205
+ for (const node of nodes) {
206
+ parent.insertBefore(node, nextSibling);
207
+ }
208
+ break;
209
+ case "inside-start":
210
+ const firstChild = element.firstChild;
211
+ for (let i = nodes.length - 1; i >= 0; i--) {
212
+ element.insertBefore(nodes[i], firstChild);
213
+ }
214
+ break;
215
+ case "inside-end":
216
+ for (const node of nodes) {
217
+ element.appendChild(node);
218
+ }
219
+ break;
220
+ }
221
+ }
222
+ /**
223
+ * Execute an insert operation
224
+ */
225
+ export function executeInsert(context, position, content) {
226
+ const { elements, error } = getTargetElements(context);
227
+ if (error)
228
+ return error;
229
+ try {
230
+ const nodes = parseContent(context.document, content);
231
+ if (nodes.length === 0) {
232
+ return {
233
+ error: true,
234
+ message: "Content to insert is empty or invalid",
235
+ };
236
+ }
237
+ for (const element of elements) {
238
+ // Clone nodes for each target (except the first)
239
+ const nodesToInsert = elements.indexOf(element) === 0
240
+ ? nodes
241
+ : nodes.map((n) => n.cloneNode(true));
242
+ insertContent(element, position, nodesToInsert);
243
+ }
244
+ return {
245
+ bufferId: "", // Will be set by caller
246
+ success: true,
247
+ operation: "insert",
248
+ matchCount: elements.length,
249
+ oldSize: 0, // Will be set by caller
250
+ newSize: 0, // Will be set by caller
251
+ affectedElements: elements.map((e) => e.tagName.toLowerCase()),
252
+ };
253
+ }
254
+ catch (e) {
255
+ return {
256
+ error: true,
257
+ message: e instanceof Error ? e.message : String(e),
258
+ };
259
+ }
260
+ }
261
+ /**
262
+ * Execute an update operation
263
+ */
264
+ export function executeUpdate(context, content, attributes) {
265
+ const { elements, error } = getTargetElements(context);
266
+ if (error)
267
+ return error;
268
+ try {
269
+ for (const element of elements) {
270
+ // Update content if provided
271
+ if (content !== undefined) {
272
+ // Clear existing content
273
+ while (element.firstChild) {
274
+ element.removeChild(element.firstChild);
275
+ }
276
+ // Parse and insert new content
277
+ const nodes = parseContent(context.document, content);
278
+ for (const node of nodes) {
279
+ element.appendChild(node);
280
+ }
281
+ }
282
+ // Update attributes if provided
283
+ if (attributes) {
284
+ for (const [name, value] of Object.entries(attributes)) {
285
+ if (value === null || value === "") {
286
+ element.removeAttribute(name);
287
+ }
288
+ else {
289
+ element.setAttribute(name, value);
290
+ }
291
+ }
292
+ }
293
+ }
294
+ return {
295
+ bufferId: "",
296
+ success: true,
297
+ operation: "update",
298
+ matchCount: elements.length,
299
+ oldSize: 0,
300
+ newSize: 0,
301
+ affectedElements: elements.map((e) => e.tagName.toLowerCase()),
302
+ };
303
+ }
304
+ catch (e) {
305
+ return {
306
+ error: true,
307
+ message: e instanceof Error ? e.message : String(e),
308
+ };
309
+ }
310
+ }
311
+ /**
312
+ * Execute a remove operation
313
+ */
314
+ export function executeRemove(context) {
315
+ const { elements, error } = getTargetElements(context);
316
+ if (error)
317
+ return error;
318
+ const removed = [];
319
+ for (const element of elements) {
320
+ const parent = element.parentNode;
321
+ if (parent) {
322
+ removed.push(element.tagName.toLowerCase());
323
+ parent.removeChild(element);
324
+ }
325
+ }
326
+ return {
327
+ bufferId: "",
328
+ success: true,
329
+ operation: "remove",
330
+ matchCount: removed.length,
331
+ oldSize: 0,
332
+ newSize: 0,
333
+ affectedElements: removed,
334
+ };
335
+ }
336
+ /**
337
+ * Execute a move operation
338
+ */
339
+ export function executeMoveOperation(context, targetSelector, position) {
340
+ const { elements, error } = getTargetElements(context);
341
+ if (error)
342
+ return error;
343
+ // Find target element
344
+ const targetResult = querySelector(context.document, targetSelector);
345
+ if (targetResult.matches.length === 0) {
346
+ return {
347
+ error: true,
348
+ message: `Target selector "${targetSelector}" matches no elements`,
349
+ details: { selector: targetSelector, matchCount: 0, ...getSelectorErrorDetails(targetSelector) },
350
+ };
351
+ }
352
+ if (targetResult.matches.length > 1) {
353
+ return {
354
+ error: true,
355
+ message: `Target selector "${targetSelector}" matches ${targetResult.matches.length} elements (must be unique)`,
356
+ details: { selector: targetSelector, matchCount: targetResult.matches.length },
357
+ };
358
+ }
359
+ const targetElement = targetResult.matches[0].element;
360
+ try {
361
+ for (const element of elements) {
362
+ // Remove from current position
363
+ const parent = element.parentNode;
364
+ if (parent) {
365
+ parent.removeChild(element);
366
+ }
367
+ // Insert at new position
368
+ insertContent(targetElement, position, [element]);
369
+ }
370
+ return {
371
+ bufferId: "",
372
+ success: true,
373
+ operation: "move",
374
+ matchCount: elements.length,
375
+ oldSize: 0,
376
+ newSize: 0,
377
+ affectedElements: elements.map((e) => e.tagName.toLowerCase()),
378
+ };
379
+ }
380
+ catch (e) {
381
+ return {
382
+ error: true,
383
+ message: e instanceof Error ? e.message : String(e),
384
+ };
385
+ }
386
+ }
387
+ /**
388
+ * Execute a wrap operation
389
+ */
390
+ export function executeWrap(context, wrapperContent) {
391
+ const { elements, error } = getTargetElements(context);
392
+ if (error)
393
+ return error;
394
+ try {
395
+ // Parse wrapper content - should be a single element
396
+ const nodes = parseContent(context.document, wrapperContent);
397
+ if (nodes.length === 0 || nodes[0].nodeType !== 1) {
398
+ return {
399
+ error: true,
400
+ message: "Wrapper content must be a single element",
401
+ };
402
+ }
403
+ const wrapperTemplate = nodes[0];
404
+ for (const element of elements) {
405
+ const parent = element.parentNode;
406
+ if (!parent)
407
+ continue;
408
+ // Clone the wrapper for each element
409
+ const wrapper = wrapperTemplate.cloneNode(true);
410
+ // Find where to insert the wrapped element
411
+ // If wrapper has empty content, insert there; otherwise append
412
+ let insertionPoint = wrapper;
413
+ const findInsertionPoint = (el) => {
414
+ if (el.children.length === 0)
415
+ return el;
416
+ for (const child of el.children) {
417
+ const result = findInsertionPoint(child);
418
+ if (result)
419
+ return result;
420
+ }
421
+ return null;
422
+ };
423
+ const emptyElement = findInsertionPoint(wrapper);
424
+ if (emptyElement) {
425
+ insertionPoint = emptyElement;
426
+ }
427
+ // Replace element with wrapper containing element
428
+ parent.insertBefore(wrapper, element);
429
+ parent.removeChild(element);
430
+ insertionPoint.appendChild(element);
431
+ }
432
+ return {
433
+ bufferId: "",
434
+ success: true,
435
+ operation: "wrap",
436
+ matchCount: elements.length,
437
+ oldSize: 0,
438
+ newSize: 0,
439
+ affectedElements: elements.map((e) => e.tagName.toLowerCase()),
440
+ };
441
+ }
442
+ catch (e) {
443
+ return {
444
+ error: true,
445
+ message: e instanceof Error ? e.message : String(e),
446
+ };
447
+ }
448
+ }
449
+ /**
450
+ * Convenience wrapper: Insert element
451
+ */
452
+ export function insertElement(document, selector, position, content, options) {
453
+ const selectorResult = querySelector(document, selector);
454
+ if (selectorResult.matches.length === 0) {
455
+ return {
456
+ error: true,
457
+ message: `No elements found matching selector: ${selector}`,
458
+ details: { selector, matchCount: 0, ...getSelectorErrorDetails(selector) },
459
+ };
460
+ }
461
+ const context = {
462
+ document,
463
+ matches: selectorResult.matches,
464
+ matchIndex: options?.matchIndex,
465
+ matchAll: options?.matchAll,
466
+ };
467
+ return executeInsert(context, position, content);
468
+ }
469
+ /**
470
+ * Convenience wrapper: Update element
471
+ */
472
+ export function updateElement(document, selector, updates, options) {
473
+ const selectorResult = querySelector(document, selector);
474
+ if (selectorResult.matches.length === 0) {
475
+ return {
476
+ error: true,
477
+ message: `No elements found matching selector: ${selector}`,
478
+ details: { selector, matchCount: 0, ...getSelectorErrorDetails(selector) },
479
+ };
480
+ }
481
+ const context = {
482
+ document,
483
+ matches: selectorResult.matches,
484
+ matchIndex: options?.matchIndex,
485
+ matchAll: options?.matchAll,
486
+ };
487
+ return executeUpdate(context, updates.content, updates.attributes);
488
+ }
489
+ /**
490
+ * Convenience wrapper: Remove element
491
+ */
492
+ export function removeElement(document, selector, options) {
493
+ const selectorResult = querySelector(document, selector);
494
+ if (selectorResult.matches.length === 0) {
495
+ return {
496
+ error: true,
497
+ message: `No elements found matching selector: ${selector}`,
498
+ details: { selector, matchCount: 0, ...getSelectorErrorDetails(selector) },
499
+ };
500
+ }
501
+ const context = {
502
+ document,
503
+ matches: selectorResult.matches,
504
+ matchIndex: options?.matchIndex,
505
+ matchAll: options?.matchAll,
506
+ };
507
+ return executeRemove(context);
508
+ }
509
+ /**
510
+ * Convenience wrapper: Move element
511
+ */
512
+ export function moveElement(document, selector, targetSelector, position, options) {
513
+ const selectorResult = querySelector(document, selector);
514
+ if (selectorResult.matches.length === 0) {
515
+ return {
516
+ error: true,
517
+ message: `No elements found matching selector: ${selector}`,
518
+ details: { selector, matchCount: 0, ...getSelectorErrorDetails(selector) },
519
+ };
520
+ }
521
+ const context = {
522
+ document,
523
+ matches: selectorResult.matches,
524
+ matchIndex: options?.matchIndex,
525
+ matchAll: options?.matchAll,
526
+ };
527
+ return executeMoveOperation(context, targetSelector, position);
528
+ }
529
+ /**
530
+ * Convenience wrapper: Wrap element
531
+ */
532
+ export function wrapElement(document, selector, wrapperContent, options) {
533
+ const selectorResult = querySelector(document, selector);
534
+ if (selectorResult.matches.length === 0) {
535
+ return {
536
+ error: true,
537
+ message: `No elements found matching selector: ${selector}`,
538
+ details: { selector, matchCount: 0, ...getSelectorErrorDetails(selector) },
539
+ };
540
+ }
541
+ const context = {
542
+ document,
543
+ matches: selectorResult.matches,
544
+ matchIndex: options?.matchIndex,
545
+ matchAll: options?.matchAll,
546
+ };
547
+ return executeWrap(context, wrapperContent);
548
+ }
549
+ /**
550
+ * Execute an XHTML edit operation
551
+ */
552
+ export function executeOperation(document, operation, selector, options) {
553
+ // Find matching elements
554
+ const selectorResult = querySelector(document, selector);
555
+ const context = {
556
+ document,
557
+ matches: selectorResult.matches,
558
+ matchIndex: options.matchIndex,
559
+ matchAll: options.matchAll,
560
+ };
561
+ switch (operation) {
562
+ case "insert":
563
+ case "insert-plantuml":
564
+ if (!options.position) {
565
+ return { error: true, message: "Position is required for insert operation" };
566
+ }
567
+ if (!options.content) {
568
+ return { error: true, message: "Content is required for insert operation" };
569
+ }
570
+ return executeInsert(context, options.position, options.content);
571
+ case "update":
572
+ case "update-plantuml":
573
+ if (!options.content && !options.attributes) {
574
+ return { error: true, message: "Content or attributes required for update operation" };
575
+ }
576
+ return executeUpdate(context, options.content, options.attributes);
577
+ case "remove":
578
+ return executeRemove(context);
579
+ case "move":
580
+ if (!options.targetSelector) {
581
+ return { error: true, message: "targetSelector is required for move operation" };
582
+ }
583
+ if (!options.position) {
584
+ return { error: true, message: "Position is required for move operation" };
585
+ }
586
+ return executeMoveOperation(context, options.targetSelector, options.position);
587
+ case "wrap":
588
+ if (!options.content) {
589
+ return { error: true, message: "Content (wrapper element) is required for wrap operation" };
590
+ }
591
+ return executeWrap(context, options.content);
592
+ default:
593
+ return { error: true, message: `Unknown operation: ${operation}` };
594
+ }
595
+ }
596
+ //# sourceMappingURL=operations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"operations.js","sourceRoot":"","sources":["../../../src/utils/xhtml/operations.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,64 @@
1
+ /**
2
+ * XHTML Parser using linkedom
3
+ *
4
+ * Parses Confluence storage format (XHTML) with namespace support for ac: and ri: elements.
5
+ */
6
+ import { type Document, type Element } from "linkedom";
7
+ import type { ParseResult } from "./types.js";
8
+ export declare const CONFLUENCE_NAMESPACES: {
9
+ readonly ac: "http://atlassian.com/content";
10
+ readonly ri: "http://atlassian.com/resource/identifier";
11
+ };
12
+ /**
13
+ * Unwrap CDATA sections to preserve their content during HTML parsing.
14
+ *
15
+ * The parseHTML function from linkedom treats CDATA as HTML comments and
16
+ * discards the content. This function converts CDATA sections to plain text
17
+ * before parsing, preserving the content as textContent of the element.
18
+ *
19
+ * @param content - XHTML content with potential CDATA sections
20
+ * @returns Content with CDATA markers removed but content preserved
21
+ */
22
+ export declare function unwrapCdata(content: string): string;
23
+ /**
24
+ * Wrap content with namespace declarations if needed
25
+ */
26
+ export declare function wrapWithNamespaces(content: string): {
27
+ wrapped: string;
28
+ needsUnwrap: boolean;
29
+ };
30
+ /**
31
+ * Parse XHTML content into a DOM Document
32
+ *
33
+ * @param content - XHTML content string (Confluence storage format)
34
+ * @returns ParseResult with document or error
35
+ */
36
+ export declare function parseXhtml(content: string): ParseResult;
37
+ /**
38
+ * Get the root element for operations
39
+ *
40
+ * If we wrapped the content, returns the wrapper's children.
41
+ * Otherwise returns the document root.
42
+ */
43
+ export declare function getContentRoot(document: Document): Element | null;
44
+ /**
45
+ * Check if content is valid XHTML (well-formed XML)
46
+ */
47
+ export declare function isValidXhtml(content: string): boolean;
48
+ /**
49
+ * Extract text content from an element, stripping all tags
50
+ */
51
+ export declare function extractTextContent(element: Element): string;
52
+ /**
53
+ * Get the tag name including namespace prefix
54
+ */
55
+ export declare function getQualifiedTagName(element: Element): string;
56
+ /**
57
+ * Check if an element has a specific namespace prefix
58
+ */
59
+ export declare function hasNamespacePrefix(element: Element, prefix: "ac" | "ri"): boolean;
60
+ /**
61
+ * Get the local name (tag name without namespace prefix)
62
+ */
63
+ export declare function getLocalName(element: Element): string;
64
+ //# sourceMappingURL=parser.d.ts.map