Skip to content
This repository was archived by the owner on Mar 24, 2022. It is now read-only.

Commit 0f41cc2

Browse files
fb55jolyndenning
andcommitted
feat: Add serializeOuter method
Fixes inikulin#230, inikulin#378 Uses the test case from inikulin#378, by @joeldenning Co-Authored-By: Joel Denning <[email protected]>
1 parent 0f129f4 commit 0f41cc2

File tree

3 files changed

+43
-3
lines changed

3 files changed

+43
-3
lines changed

packages/parse5/lib/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import type { DefaultTreeAdapterMap } from './tree-adapters/default.js';
44
import type { TreeAdapterTypeMap } from './tree-adapters/interface.js';
55

66
export { ParserOptions } from './parser/index.js';
7-
export { serialize, SerializerOptions } from './serializer/index.js';
7+
export { serialize, serializeOuter, SerializerOptions } from './serializer/index.js';
88

99
// Shorthands
1010

packages/parse5/lib/serializer/index.test.ts

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import * as parse5 from 'parse5';
33
import outdent from 'outdent';
44
import { generateSerializerTests } from 'parse5-test-utils/utils/generate-serializer-tests.js';
55
import { treeAdapters } from 'parse5-test-utils/utils/common.js';
6-
import type { Element } from 'parse5/dist/tree-adapters/default';
6+
import { type Element, isElementNode } from 'parse5/dist/tree-adapters/default';
77
import type { TreeAdapter } from 'parse5/dist/tree-adapters/interface.js';
88

99
generateSerializerTests('serializer', 'Serializer', parse5.serialize);
@@ -50,4 +50,15 @@ describe('serializer', () => {
5050
expect(parse5.serialize(document)).toContain(input);
5151
});
5252
});
53+
54+
describe('serializeOuter', () => {
55+
it('serializes outerHTML correctly', () => {
56+
const document = parse5.parseFragment('<div><button>Hello</button></div>');
57+
const div = document.childNodes[0];
58+
assert.ok(isElementNode(div));
59+
const html = parse5.serializeOuter(div);
60+
61+
assert.equal(html, '<div><button>Hello</button></div>');
62+
});
63+
});
5364
});

packages/parse5/lib/serializer/index.ts

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,8 @@ export interface SerializerOptions<T extends TreeAdapterTypeMap> {
5050

5151
type InternalOptions<T extends TreeAdapterTypeMap> = Required<SerializerOptions<T>>;
5252

53+
const defaultOpts = { treeAdapter: DefaultTreeAdapter, scriptingEnabled: true };
54+
5355
/**
5456
* Serializes an AST node to an HTML string.
5557
*
@@ -76,10 +78,37 @@ export function serialize<T extends TreeAdapterTypeMap = DefaultTreeAdapter.Defa
7678
node: T['parentNode'],
7779
options?: SerializerOptions<T>
7880
): string {
79-
const opts = { treeAdapter: DefaultTreeAdapter, scriptingEnabled: true, ...options };
81+
const opts = { ...defaultOpts, ...options };
8082
return serializeChildNodes(node, opts);
8183
}
8284

85+
/**
86+
* Serializes an AST element node to an HTML string, including the element node.
87+
*
88+
* @example
89+
*
90+
* ```js
91+
* const parse5 = require('parse5');
92+
*
93+
* const document = parse5.parseFragment('<div>Hello, <b>world</b>!</div>');
94+
*
95+
* // Serializes the <div> element.
96+
* const html = parse5.serializeOuter(document.childNodes[0]);
97+
*
98+
* console.log(str); //> '<div>Hello, <b>world</b>!</div>'
99+
* ```
100+
*
101+
* @param node Node to serialize.
102+
* @param options Serialization options.
103+
*/
104+
export function serializeOuter<T extends TreeAdapterTypeMap = DefaultTreeAdapter.DefaultTreeAdapterMap>(
105+
node: T['element'],
106+
options?: SerializerOptions<T>
107+
): string {
108+
const opts = { ...defaultOpts, ...options };
109+
return serializeElement(node, opts);
110+
}
111+
83112
function serializeChildNodes<T extends TreeAdapterTypeMap>(
84113
parentNode: T['parentNode'],
85114
options: InternalOptions<T>

0 commit comments

Comments
 (0)