Skip to content

Commit 5101693

Browse files
committed
feat: support for multiple blocks declaration in layout
1 parent 75ba49b commit 5101693

File tree

1 file changed

+31
-12
lines changed

1 file changed

+31
-12
lines changed

src/index.js

Lines changed: 31 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,12 @@ const extend = (options = {}) => tree => {
2626

2727
const blockNodes = getBlockNodes(options.slotTagName, tree);
2828
for (const blockName of Object.keys(blockNodes)) {
29-
const blockNode = blockNodes[blockName];
30-
blockNode.tag = false;
31-
blockNode.content = blockNode.content || [];
32-
blockNodes[blockName] = blockNode;
29+
const blockNodeList = blockNodes[blockName];
30+
for (const blockNode of blockNodeList) {
31+
blockNode.tag = false;
32+
blockNode.content = blockNode.content || [];
33+
}
34+
blockNodes[blockName] = blockNodeList;
3335
}
3436

3537
return tree;
@@ -81,17 +83,24 @@ function mergeExtendsAndLayout(layoutTree, extendsNode, strictNames, slotTagName
8183
const extendsBlockNodes = getBlockNodes(fillTagName, extendsNode.content);
8284

8385
for (const layoutBlockName of Object.keys(layoutBlockNodes)) {
84-
const extendsBlockNode = extendsBlockNodes[layoutBlockName];
86+
const extendsBlockNodeList = extendsBlockNodes[layoutBlockName]
87+
if (!extendsBlockNodeList) {
88+
continue;
89+
}
90+
// pick up the last block node if multiple blocks are declared in `extends` node
91+
const extendsBlockNode = extendsBlockNodeList[extendsBlockNodeList.length - 1];
8592
if (!extendsBlockNode) {
8693
continue;
8794
}
8895

89-
const layoutBlockNode = layoutBlockNodes[layoutBlockName];
90-
layoutBlockNode.content = mergeContent(
91-
extendsBlockNode.content,
92-
layoutBlockNode.content,
93-
getBlockType(extendsBlockNode)
94-
);
96+
const layoutBlockNodeList = layoutBlockNodes[layoutBlockName];
97+
for (const layoutBlockNode of layoutBlockNodeList) {
98+
layoutBlockNode.content = mergeContent(
99+
extendsBlockNode.content,
100+
layoutBlockNode.content,
101+
getBlockType(extendsBlockNode)
102+
);
103+
}
95104

96105
delete extendsBlockNodes[layoutBlockName];
97106
}
@@ -146,13 +155,23 @@ function getBlockNodes(tag, content = []) {
146155
throw getError(errors.BLOCK_NO_NAME);
147156
}
148157

149-
blockNodes[node.attrs.name] = node;
158+
appendBlockNode(blockNodes, node)
150159
return node;
151160
});
152161

153162
return blockNodes;
154163
}
155164

165+
function appendBlockNode(blockNodes, node) {
166+
const { name } = node.attrs
167+
if (blockNodes[name] == null) {
168+
blockNodes[name] = [node]
169+
} else {
170+
blockNodes[name].push(node)
171+
}
172+
return blockNodes
173+
}
174+
156175
function getError(...rest) {
157176
const message = format(...rest);
158177
return new Error('[posthtml-extend] ' + message);

0 commit comments

Comments
 (0)