@@ -269,7 +269,14 @@ async function renderTemplate(template, data, key, index, keyPath) {
269
269
let renderAs = template . element . getAttribute ( 'render-as' ) || key ;
270
270
template . renderAs = renderAs
271
271
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
+
273
280
let exclude = template . element . getAttribute ( 'render-exclude' ) || ''
274
281
if ( exclude ) {
275
282
exclude = exclude . replace ( / / g, '' ) . split ( "," )
@@ -335,7 +342,10 @@ async function renderTemplate(template, data, key, index, keyPath) {
335
342
} else
336
343
object = renderData [ i ]
337
344
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 ) ;
339
349
insertElement ( template , clone . element , index ) ;
340
350
}
341
351
}
@@ -413,7 +423,7 @@ function insertElement(template, element, index, currentIndex) {
413
423
}
414
424
}
415
425
416
- async function renderValues ( node , data , key , renderAs , keyPath , parent ) {
426
+ async function renderValues ( node , data , key , renderAs , keyPath , parent , index ) {
417
427
if ( ! data ) return ;
418
428
419
429
let renderedNode = renderedNodes . get ( node )
@@ -486,8 +496,8 @@ async function renderValues(node, data, key, renderAs, keyPath, parent) {
486
496
let namePlaceholder = renderedAttribute . placeholder . name || name ;
487
497
let valuePlaceholder = renderedAttribute . placeholder . value || value ;
488
498
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 ) ;
491
501
if ( namePlaceholder . includes ( '{{' ) && name ) {
492
502
const attributes = name . match ( / ( [ ^ \s ] + = " [ ^ " ] * " | [ ^ \s ] + ) / g) || [ ] ;
493
503
attributes . forEach ( attr => {
@@ -526,7 +536,7 @@ async function renderValues(node, data, key, renderAs, keyPath, parent) {
526
536
} else if ( node . childNodes . length > 0 ) {
527
537
// Array.from(node.childNodes).forEach(childNode => {
528
538
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 ) ;
530
540
}
531
541
// });
532
542
}
@@ -544,7 +554,7 @@ async function renderValues(node, data, key, renderAs, keyPath, parent) {
544
554
return
545
555
textContent = renderedNode . placeholder || node . textContent ;
546
556
547
- text = await renderValue ( node , data , textContent , renderAs , renderedNode ) ;
557
+ text = await renderValue ( node , data , textContent , renderAs , renderedNode , index ) ;
548
558
549
559
if ( text || text == "" ) {
550
560
if ( text != renderedNode . text ) {
@@ -573,7 +583,7 @@ async function renderValues(node, data, key, renderAs, keyPath, parent) {
573
583
if ( node . childNodes . length > 0 ) {
574
584
// Array.from(node.childNodes).forEach(childNode => {
575
585
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 ) ;
577
587
}
578
588
// });
579
589
}
@@ -582,8 +592,9 @@ async function renderValues(node, data, key, renderAs, keyPath, parent) {
582
592
}
583
593
}
584
594
585
- async function renderValue ( node , data , placeholder , renderAs , renderedNode ) {
595
+ async function renderValue ( node , data , placeholder , renderAs , renderedNode , index ) {
586
596
let output = placeholder ;
597
+
587
598
let regex = / \{ ( [ ^ { } ] + ) \} /
588
599
let omitted = { }
589
600
@@ -593,7 +604,10 @@ async function renderValue(node, data, placeholder, renderAs, renderedNode) {
593
604
if ( match ) {
594
605
let value ;
595
606
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
597
611
match [ 1 ] = match [ 1 ] . slice ( 1 , - 1 ) ;
598
612
value = getRenderValue ( node , data , match [ 1 ] , renderAs ) ;
599
613
} 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) {
632
646
console . error ( error )
633
647
}
634
648
635
- if ( value || value === "" ) {
649
+ if ( value || value === "" || value >= 0 ) {
636
650
if ( typeof value === "object" ) {
637
651
value = JSON . stringify ( value , null , 2 ) ;
638
652
}
0 commit comments