@@ -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+
156175function getError ( ...rest ) {
157176 const message = format ( ...rest ) ;
158177 return new Error ( '[posthtml-extend] ' + message ) ;
0 commit comments