@crypto512/jicon-mcp 0.7.1 → 1.0.1
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 +128 -395
- package/TOOL_LIST.md +810 -120
- package/dist/config/constants.d.ts +1 -0
- package/dist/config/constants.d.ts.map +1 -1
- package/dist/config/constants.js +1 -0
- package/dist/config/constants.js.map +1 -1
- package/dist/config/loader.d.ts +1 -0
- package/dist/config/loader.d.ts.map +1 -1
- package/dist/config/loader.js +27 -1
- package/dist/config/loader.js.map +1 -1
- package/dist/config/types.d.ts +8 -0
- package/dist/config/types.d.ts.map +1 -1
- package/dist/config/types.js +2 -0
- package/dist/config/types.js.map +1 -1
- package/dist/confluence/client.d.ts +38 -0
- package/dist/confluence/client.d.ts.map +1 -1
- package/dist/confluence/client.js +117 -0
- package/dist/confluence/client.js.map +1 -1
- package/dist/confluence/tools.d.ts +102 -75
- package/dist/confluence/tools.d.ts.map +1 -1
- package/dist/confluence/tools.js +510 -151
- package/dist/confluence/tools.js.map +1 -1
- package/dist/confluence/types.d.ts +55 -1
- package/dist/confluence/types.d.ts.map +1 -1
- package/dist/index.js +88 -2
- package/dist/index.js.map +1 -1
- package/dist/jira/tools.d.ts +0 -5
- package/dist/jira/tools.d.ts.map +1 -1
- package/dist/jira/tools.js +40 -87
- package/dist/jira/tools.js.map +1 -1
- package/dist/permissions/filter.d.ts +5 -0
- package/dist/permissions/filter.d.ts.map +1 -1
- package/dist/permissions/filter.js +29 -12
- package/dist/permissions/filter.js.map +1 -1
- package/dist/permissions/tool-registry.d.ts +23 -25
- package/dist/permissions/tool-registry.d.ts.map +1 -1
- package/dist/permissions/tool-registry.js +41 -45
- package/dist/permissions/tool-registry.js.map +1 -1
- package/dist/permissions/write-home-validator.d.ts +35 -0
- package/dist/permissions/write-home-validator.d.ts.map +1 -0
- package/dist/permissions/write-home-validator.js +140 -0
- package/dist/permissions/write-home-validator.js.map +1 -0
- package/dist/tempo/tools.d.ts.map +1 -1
- package/dist/tempo/tools.js +43 -44
- package/dist/tempo/tools.js.map +1 -1
- package/dist/utils/buffer-tools.d.ts +119 -1
- package/dist/utils/buffer-tools.d.ts.map +1 -1
- package/dist/utils/buffer-tools.js +610 -3
- package/dist/utils/buffer-tools.js.map +1 -1
- package/dist/utils/content-buffer.d.ts +34 -0
- package/dist/utils/content-buffer.d.ts.map +1 -1
- package/dist/utils/content-buffer.js +79 -0
- package/dist/utils/content-buffer.js.map +1 -1
- package/dist/utils/http-client.d.ts.map +1 -1
- package/dist/utils/http-client.js +4 -4
- package/dist/utils/http-client.js.map +1 -1
- package/dist/utils/jicon-help.d.ts +29 -0
- package/dist/utils/jicon-help.d.ts.map +1 -0
- package/dist/utils/jicon-help.js +873 -0
- package/dist/utils/jicon-help.js.map +1 -0
- package/dist/utils/plantuml/client.d.ts +40 -0
- package/dist/utils/plantuml/client.d.ts.map +1 -0
- package/dist/utils/plantuml/client.js +306 -0
- package/dist/utils/plantuml/client.js.map +1 -0
- package/dist/utils/plantuml/docker-manager.d.ts +35 -0
- package/dist/utils/plantuml/docker-manager.d.ts.map +1 -0
- package/dist/utils/plantuml/docker-manager.js +280 -0
- package/dist/utils/plantuml/docker-manager.js.map +1 -0
- package/dist/utils/plantuml/index.d.ts +11 -0
- package/dist/utils/plantuml/index.d.ts.map +1 -0
- package/dist/utils/plantuml/index.js +16 -0
- package/dist/utils/plantuml/index.js.map +1 -0
- package/dist/utils/plantuml/service.d.ts +46 -0
- package/dist/utils/plantuml/service.d.ts.map +1 -0
- package/dist/utils/plantuml/service.js +96 -0
- package/dist/utils/plantuml/service.js.map +1 -0
- package/dist/utils/plantuml/tools.d.ts +65 -0
- package/dist/utils/plantuml/tools.d.ts.map +1 -0
- package/dist/utils/plantuml/tools.js +272 -0
- package/dist/utils/plantuml/tools.js.map +1 -0
- package/dist/utils/plantuml/types.d.ts +130 -0
- package/dist/utils/plantuml/types.d.ts.map +1 -0
- package/dist/utils/plantuml/types.js +66 -0
- package/dist/utils/plantuml/types.js.map +1 -0
- package/dist/utils/response-formatter.d.ts +14 -0
- package/dist/utils/response-formatter.d.ts.map +1 -1
- package/dist/utils/response-formatter.js +84 -1
- package/dist/utils/response-formatter.js.map +1 -1
- package/dist/utils/url-tools.d.ts +49 -0
- package/dist/utils/url-tools.d.ts.map +1 -0
- package/dist/utils/url-tools.js +141 -0
- package/dist/utils/url-tools.js.map +1 -0
- package/dist/utils/xhtml/confluence-schema.d.ts +55 -0
- package/dist/utils/xhtml/confluence-schema.d.ts.map +1 -0
- package/dist/utils/xhtml/confluence-schema.js +215 -0
- package/dist/utils/xhtml/confluence-schema.js.map +1 -0
- package/dist/utils/xhtml/index.d.ts +17 -0
- package/dist/utils/xhtml/index.d.ts.map +1 -0
- package/dist/utils/xhtml/index.js +21 -0
- package/dist/utils/xhtml/index.js.map +1 -0
- package/dist/utils/xhtml/operations.d.ts +100 -0
- package/dist/utils/xhtml/operations.d.ts.map +1 -0
- package/dist/utils/xhtml/operations.js +596 -0
- package/dist/utils/xhtml/operations.js.map +1 -0
- package/dist/utils/xhtml/parser.d.ts +64 -0
- package/dist/utils/xhtml/parser.d.ts.map +1 -0
- package/dist/utils/xhtml/parser.js +180 -0
- package/dist/utils/xhtml/parser.js.map +1 -0
- package/dist/utils/xhtml/plantuml.d.ts +112 -0
- package/dist/utils/xhtml/plantuml.d.ts.map +1 -0
- package/dist/utils/xhtml/plantuml.js +251 -0
- package/dist/utils/xhtml/plantuml.js.map +1 -0
- package/dist/utils/xhtml/selector.d.ts +35 -0
- package/dist/utils/xhtml/selector.d.ts.map +1 -0
- package/dist/utils/xhtml/selector.js +358 -0
- package/dist/utils/xhtml/selector.js.map +1 -0
- package/dist/utils/xhtml/serializer.d.ts +26 -0
- package/dist/utils/xhtml/serializer.d.ts.map +1 -0
- package/dist/utils/xhtml/serializer.js +170 -0
- package/dist/utils/xhtml/serializer.js.map +1 -0
- package/dist/utils/xhtml/types.d.ts +134 -0
- package/dist/utils/xhtml/types.d.ts.map +1 -0
- package/dist/utils/xhtml/types.js +65 -0
- package/dist/utils/xhtml/types.js.map +1 -0
- package/dist/utils/xhtml/validator.d.ts +67 -0
- package/dist/utils/xhtml/validator.d.ts.map +1 -0
- package/dist/utils/xhtml/validator.js +300 -0
- package/dist/utils/xhtml/validator.js.map +1 -0
- 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
|