sugar
Version:
A Javascript utility library for working with native objects.
82 lines (71 loc) • 2.34 kB
JavaScript
;
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;