@@ -26,10 +26,12 @@ const extend = (options = {}) => tree => {
26
26
27
27
const blockNodes = getBlockNodes ( options . slotTagName , tree ) ;
28
28
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 ;
33
35
}
34
36
35
37
return tree ;
@@ -81,17 +83,24 @@ function mergeExtendsAndLayout(layoutTree, extendsNode, strictNames, slotTagName
81
83
const extendsBlockNodes = getBlockNodes ( fillTagName , extendsNode . content ) ;
82
84
83
85
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 ] ;
85
92
if ( ! extendsBlockNode ) {
86
93
continue ;
87
94
}
88
95
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
+ }
95
104
96
105
delete extendsBlockNodes [ layoutBlockName ] ;
97
106
}
@@ -146,13 +155,23 @@ function getBlockNodes(tag, content = []) {
146
155
throw getError ( errors . BLOCK_NO_NAME ) ;
147
156
}
148
157
149
- blockNodes [ node . attrs . name ] = node ;
158
+ appendBlockNode ( blockNodes , node )
150
159
return node ;
151
160
} ) ;
152
161
153
162
return blockNodes ;
154
163
}
155
164
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
+
156
175
function getError ( ...rest ) {
157
176
const message = format ( ...rest ) ;
158
177
return new Error ( '[posthtml-extend] ' + message ) ;
0 commit comments