'use strict'; var entityPrefixLength = require('./entity-prefix-length'); module.exports = copy; var PUNCTUATION = /[-!"#$%&'()*+,./:;<=>?@[\\\]^`{|}~_]/; /* For shortcut and collapsed reference links, the contents * is also an identifier, so we need to restore the original * encoding and escaping that were present in the source * string. * * This function takes the unescaped & unencoded value from * shortcut's child nodes and the identifier and encodes * the former according to the latter. */ function copy(value, identifier) { var length = value.length; var count = identifier.length; var result = []; var position = 0; var index = 0; var start; while (index < length) { /* Take next non-punctuation characters from `value`. */ start = index; while (index < length && !PUNCTUATION.test(value.charAt(index))) { index += 1; } result.push(value.slice(start, index)); /* Advance `position` to the next punctuation character. */ while (position < count && !PUNCTUATION.test(identifier.charAt(position))) { position += 1; } /* Take next punctuation characters from `identifier`. */ start = position; while (position < count && PUNCTUATION.test(identifier.charAt(position))) { if (identifier.charAt(position) === '&') { position += entityPrefixLength(identifier.slice(position)); } position += 1; } result.push(identifier.slice(start, position)); /* Advance `index` to the next non-punctuation character. */ while (index < length && PUNCTUATION.test(value.charAt(index))) { index += 1; } } return result.join(''); }