exports.printVersion = () => { const pjson = require('./package.json') console.log(`Staples ${pjson.version}`) } exports.compile = (template, input) => { let index = 0 const getValue = (tagContent) => { console.log('input', tagContent) let tagContentSplit = tagContent.split('.') let varLevel = null tagContentSplit.forEach( (level) => { const isIndex = Number.isInteger(parseInt(level)) if(!varLevel) varLevel = input varLevel = isIndex ? varLevel[parseInt(level)] : varLevel[level] }) return typeof varLevel === 'string' ? varLevel.trim() : varLevel } // Find all tags #################################################### let tags = [] while(index < template.length) { const nextOpen = template.indexOf('{{', index+1) let tagType = null if(template.substring(nextOpen,nextOpen+3) == '{{{') { tagType = 'HTML' } else if(template.substring(nextOpen,nextOpen+5) == '{{#if') { tagType = 'IF' } else if(template.substring(nextOpen,nextOpen+9) == '{{#unless') { tagType = 'UNLESS' //} else if(template.substring(nextOpen,nextOpen+5) == '{{/if') { tagType = 'CLOSE-IF' //} else if(template.substring(nextOpen,nextOpen+9) == '{{/unless') { tagType = 'CLOSE-UNLESS' } else { tagType = 'DEFAULT' } if(nextOpen == index || nextOpen == -1) { index = template.length } else { index = nextOpen let nextClose = index switch(tagType) { case 'DEFAULT': nextClose = template.indexOf('}}', index+2) index = nextClose+2 break case 'HTML': nextClose = template.indexOf('}}}', index+3) index = nextClose+3 break case 'IF': nextClose = template.indexOf('{{/if}}', index+7) index = nextClose+7 break case 'UNLESS': nextClose = template.indexOf('{{/unless}}', index+11) index = nextClose+11 break } if(nextClose == index || nextClose == -1) { index = template.length } else { tags.push({ tag: template.substring(nextOpen, index), type: tagType }) } } } // Replace tags #################################################### tags.forEach( (tag, i) => { switch(tag.type) { case 'DEFAULT': template = template.replace(tag.tag, getValue(tag.tag.substring(2, tag.tag.length-2))) break case 'HTML': template = template.replace(tag.tag, getValue(tag.tag.substring(3, tag.tag.length-3))) break } }) return template } /* exports.compile = (template, input) => { let index = 0 const getValue = (tagContent) => { console.log('input', tagContent) let tagContentSplit = tagContent.split('.') let varLevel = null tagContentSplit.forEach( (level) => { const isIndex = Number.isInteger(parseInt(level)) if(!varLevel) varLevel = input varLevel = isIndex ? varLevel[parseInt(level)] : varLevel[level] }) return typeof varLevel === 'string' ? varLevel.trim() : varLevel } while(index < template.length) { const nextOpen = template.indexOf('{{', index+1) if(nextOpen == index || nextOpen == -1) { index = template.length } else { index = nextOpen const nextClose = template.indexOf('}}', index+1) if(nextClose == index || nextClose == -1) { index = template.length } else { index = nextOpen+2 let tagContent = template.substring(nextOpen+2, nextClose) if(tagContent.substring(0,1) == '#') { const isIf = tagContent.substring(0,3) == '#if' const isUnless = tagContent.substring(0,7) == '#unless' console.log('tagContent.substring(0,3)',tagContent.substring(0,3),index) if(isIf) { const conditionStart = template.indexOf('}}', index+1) const conditionStop = template.indexOf('{{/if}}', conditionStart+1) const conditionContent = template.substring(conditionStart+2, conditionStop) const conditionFull = template.substring(index-2, conditionStop+7) const value = getValue(tagContent.substring(4)) ? conditionContent : '' template = template.replace(conditionFull, value) console.log('conditionFull',conditionFull, `-${value}-`, `-${tagContent.substring(4)}-`, conditionContent) index += value.length } else if(isUnless) { const conditionStart = template.indexOf('}}', index+1) const conditionStop = template.indexOf('{{/unless}}', conditionStart+1) const conditionContent = template.substring(conditionStart+2, conditionStop) const conditionFull = template.substring(index-2, conditionStop+11) const value = !getValue(tagContent.substring(8)) ? conditionContent : '' template = template.replace(conditionFull, value) index += value.length } console.log('index', index) } else { const value = getValue(tagContent) template = template.replace(`{{${tagContent}}}`, value) //index += value.length+1 } } } } return template }*/