Skip to content

Commit 4083e6f

Browse files
committed
feat: attribute render-type to define type of data being render
1 parent 3452190 commit 4083e6f

File tree

1 file changed

+25
-11
lines changed

1 file changed

+25
-11
lines changed

src/index.js

+25-11
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)