@@ -269,7 +269,14 @@ async function renderTemplate(template, data, key, index, keyPath) {
269269 let renderAs = template . element . getAttribute ( 'render-as' ) || key ;
270270 template . renderAs = renderAs
271271
272- if ( key && ! Array . isArray ( renderData ) ) {
272+ let renderType
273+ if ( templateData . source && templateData . source . element )
274+ renderType = templateData . source . element . getAttribute ( 'render-type' ) ;
275+
276+ if ( key && ! Array . isArray ( renderData ) || renderType === "object" ) {
277+ if ( renderType && Array . isArray ( renderData ) && renderData . length === 1 )
278+ renderData = renderData [ 0 ]
279+
273280 let exclude = template . element . getAttribute ( 'render-exclude' ) || ''
274281 if ( exclude ) {
275282 exclude = exclude . replace ( / / g, '' ) . split ( "," )
@@ -335,7 +342,10 @@ async function renderTemplate(template, data, key, index, keyPath) {
335342 } else
336343 object = renderData [ i ]
337344
338- await renderValues ( clone . element , object , key , renderAs ) ;
345+ let index
346+ if ( key !== 'data' )
347+ index = i
348+ await renderValues ( clone . element , object , key , renderAs , null , null , index ) ;
339349 insertElement ( template , clone . element , index ) ;
340350 }
341351 }
@@ -413,7 +423,7 @@ function insertElement(template, element, index, currentIndex) {
413423 }
414424}
415425
416- async function renderValues ( node , data , key , renderAs , keyPath , parent ) {
426+ async function renderValues ( node , data , key , renderAs , keyPath , parent , index ) {
417427 if ( ! data ) return ;
418428
419429 let renderedNode = renderedNodes . get ( node )
@@ -486,8 +496,8 @@ async function renderValues(node, data, key, renderAs, keyPath, parent) {
486496 let namePlaceholder = renderedAttribute . placeholder . name || name ;
487497 let valuePlaceholder = renderedAttribute . placeholder . value || value ;
488498
489- name = await renderValue ( attr , data , namePlaceholder , renderAs , renderedAttribute ) ;
490- value = await renderValue ( attr , data , valuePlaceholder , renderAs , renderedAttribute ) ;
499+ name = await renderValue ( attr , data , namePlaceholder , renderAs , renderedAttribute , index ) ;
500+ value = await renderValue ( attr , data , valuePlaceholder , renderAs , renderedAttribute , index ) ;
491501 if ( namePlaceholder . includes ( '{{' ) && name ) {
492502 const attributes = name . match ( / ( [ ^ \s ] + = " [ ^ " ] * " | [ ^ \s ] + ) / g) || [ ] ;
493503 attributes . forEach ( attr => {
@@ -526,7 +536,7 @@ async function renderValues(node, data, key, renderAs, keyPath, parent) {
526536 } else if ( node . childNodes . length > 0 ) {
527537 // Array.from(node.childNodes).forEach(childNode => {
528538 for ( let childNode of node . childNodes ) {
529- await renderValues ( childNode , data , key , renderAs , keyPath , parent ) ;
539+ await renderValues ( childNode , data , key , renderAs , keyPath , parent , index ) ;
530540 }
531541 // });
532542 }
@@ -544,7 +554,7 @@ async function renderValues(node, data, key, renderAs, keyPath, parent) {
544554 return
545555 textContent = renderedNode . placeholder || node . textContent ;
546556
547- text = await renderValue ( node , data , textContent , renderAs , renderedNode ) ;
557+ text = await renderValue ( node , data , textContent , renderAs , renderedNode , index ) ;
548558
549559 if ( text || text == "" ) {
550560 if ( text != renderedNode . text ) {
@@ -573,7 +583,7 @@ async function renderValues(node, data, key, renderAs, keyPath, parent) {
573583 if ( node . childNodes . length > 0 ) {
574584 // Array.from(node.childNodes).forEach(childNode => {
575585 for ( let childNode of node . childNodes ) {
576- await renderValues ( childNode , data , key , renderAs , keyPath , parent ) ;
586+ await renderValues ( childNode , data , key , renderAs , keyPath , parent , index ) ;
577587 }
578588 // });
579589 }
@@ -582,8 +592,9 @@ async function renderValues(node, data, key, renderAs, keyPath, parent) {
582592 }
583593}
584594
585- async function renderValue ( node , data , placeholder , renderAs , renderedNode ) {
595+ async function renderValue ( node , data , placeholder , renderAs , renderedNode , index ) {
586596 let output = placeholder ;
597+
587598 let regex = / \{ ( [ ^ { } ] + ) \} /
588599 let omitted = { }
589600
@@ -593,7 +604,10 @@ async function renderValue(node, data, placeholder, renderAs, renderedNode) {
593604 if ( match ) {
594605 let value ;
595606 try {
596- if ( match [ 1 ] . startsWith ( '[' ) && match [ 1 ] . endsWith ( ']' ) ) { // {[]} - Dot-notation
607+
608+ if ( match [ 1 ] === 'index' && index >= 0 ) { // {[]} - Dot-notation
609+ value = index
610+ } else if ( match [ 1 ] . startsWith ( '[' ) && match [ 1 ] . endsWith ( ']' ) ) { // {[]} - Dot-notation
597611 match [ 1 ] = match [ 1 ] . slice ( 1 , - 1 ) ;
598612 value = getRenderValue ( node , data , match [ 1 ] , renderAs ) ;
599613 } else if ( match [ 1 ] . startsWith ( '(' ) && match [ 1 ] . endsWith ( ')' ) ) { // {()} - CSS Selector and JSON Structure
@@ -632,7 +646,7 @@ async function renderValue(node, data, placeholder, renderAs, renderedNode) {
632646 console . error ( error )
633647 }
634648
635- if ( value || value === "" ) {
649+ if ( value || value === "" || value >= 0 ) {
636650 if ( typeof value === "object" ) {
637651 value = JSON . stringify ( value , null , 2 ) ;
638652 }
0 commit comments