UNPKG

sugar

Version:

A Javascript utility library for working with native objects.

82 lines (71 loc) 2.34 kB
'use strict'; var tagIsVoid = require('./tagIsVoid'), classChecks = require('../../common/var/classChecks'); var isString = classChecks.isString; function runTagReplacements(str, reg, strip, replacement, fullString) { var match; var result = ''; var currentIndex = 0; var openTagName; var openTagAttributes; var openTagCount = 0; function processTag(index, tagName, attributes, tagLength, isVoid) { var content = str.slice(currentIndex, index), s = '', r = ''; if (isString(replacement)) { r = replacement; } else if (replacement) { r = replacement.call(fullString, tagName, content, attributes, fullString) || ''; } if (strip) { s = r; } else { content = r; } if (content) { content = runTagReplacements(content, reg, strip, replacement, fullString); } result += s + content + (isVoid ? '' : s); currentIndex = index + (tagLength || 0); } fullString = fullString || str; reg = RegExp(reg.source, 'gi'); while(match = reg.exec(str)) { var tagName = match[2]; var attributes = (match[3]|| '').slice(1); var isClosingTag = !!match[1]; var isSelfClosing = !!match[4]; var tagLength = match[0].length; var isVoid = tagIsVoid(tagName); var isOpeningTag = !isClosingTag && !isSelfClosing && !isVoid; var isSameAsCurrent = tagName === openTagName; if (!openTagName) { result += str.slice(currentIndex, match.index); currentIndex = match.index; } if (isOpeningTag) { if (!openTagName) { openTagName = tagName; openTagAttributes = attributes; openTagCount++; currentIndex += tagLength; } else if (isSameAsCurrent) { openTagCount++; } } else if (isClosingTag && isSameAsCurrent) { openTagCount--; if (openTagCount === 0) { processTag(match.index, openTagName, openTagAttributes, tagLength, isVoid); openTagName = null; openTagAttributes = null; } } else if (!openTagName) { processTag(match.index, tagName, attributes, tagLength, isVoid); } } if (openTagName) { processTag(str.length, openTagName, openTagAttributes); } result += str.slice(currentIndex); return result; } module.exports = runTagReplacements;