function joinUncorrupt(parts, contains) { // Before doing this "uncorruption" method here, this was done with the `part.emptyValue` trick, however, there were some corruptions that were not handled, for example with a template like this : // // ------------------------------------------------ // | {-w:p falsy}My para{/falsy} | | // | {-w:p falsy}My para{/falsy} | | // ------------------------------------------------ let collecting = ""; let currentlyCollecting = -1; return parts.reduce(function (full, part) { for (let i = 0, len = contains.length; i < len; i++) { const { tag, shouldContain, value } = contains[i]; const startTagRegex = new RegExp(`^(<(${tag})[^>]*>)$`, "g"); if (currentlyCollecting === i) { if (part === ``) { currentlyCollecting = -1; return full + collecting + value + part; } collecting += part; for (let j = 0, len2 = shouldContain.length; j < len2; j++) { const sc = shouldContain[j]; if ( part.indexOf(`<${sc} `) !== -1 || part.indexOf(`<${sc}>`) !== -1 ) { currentlyCollecting = -1; return full + collecting; } } return full; } if (currentlyCollecting === -1 && startTagRegex.test(part)) { if (part[part.length - 2] === "/") { return full; } currentlyCollecting = i; collecting = part; return full; } } return full + part; }, ""); } module.exports = joinUncorrupt;