Skip to content

Commit 19e0cae

Browse files
committed
feat: tagNameProcessor callback receives nodes as second argument
1 parent d4650f1 commit 19e0cae

File tree

3 files changed

+21
-6
lines changed

3 files changed

+21
-6
lines changed

src/__tests__/tagProcessors.test.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,19 @@ describe('XMLParser', () => {
1616
});
1717

1818
expect(result).toStrictEqual({ ANY_NAME: { PERSON: 'end' } });
19+
20+
const tagNames: Array<{ name: string; nodes: string[] }> = [];
21+
parse(xmlData, {
22+
tagNameProcessor: (name, nodes) => {
23+
tagNames.push({ name, nodes: nodes.map((c) => c.tagName) });
24+
return name.toUpperCase();
25+
},
26+
});
27+
28+
expect(tagNames).toStrictEqual([
29+
{ name: 'any_name', nodes: ['any_name'] },
30+
{ name: 'person', nodes: ['person'] },
31+
]);
1932
});
2033

2134
it('attribute name processor', () => {

src/traversable/defaultOptions.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ export interface ParseOptions {
6363
* Callback to process tag names
6464
* @default (name:string) => name
6565
*/
66-
tagNameProcessor?: (name: string) => string;
66+
tagNameProcessor?: (name: string, nodes: XMLNode[]) => string;
6767
/**
6868
* Callback to process attribute names
6969
* @default (name:string) => `$${name}`

src/traversableToJSON.ts

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -63,15 +63,17 @@ export function traversableToJSON(
6363
}
6464

6565
for (const tagName in node.children) {
66-
const newTagName = tagNameProcessor ? tagNameProcessor(tagName) : tagName;
67-
const children = node.children[tagName];
68-
if (children?.length > 1) {
66+
const nodes = node.children[tagName];
67+
const newTagName = tagNameProcessor
68+
? tagNameProcessor(tagName, nodes)
69+
: tagName;
70+
if (nodes?.length > 1) {
6971
result[tagName] = [];
70-
for (const child of children) {
72+
for (const child of nodes) {
7173
result[newTagName].push(traversableToJSON(child, options, tagName));
7274
}
7375
} else {
74-
const subResult = traversableToJSON(children[0], options, tagName);
76+
const subResult = traversableToJSON(nodes[0], options, tagName);
7577
const asArray =
7678
(arrayMode === true && typeof subResult === 'object') ||
7779
isTagNameInArrayMode(

0 commit comments

Comments
 (0)