| 'use strict' |
| |
| var entityPrefixLength = require('./entity-prefix-length') |
| |
| module.exports = copy |
| |
| var ampersand = '&' |
| |
| var punctuationExppresion = /[-!"#$%&'()*+,./:;<=>?@[\\\]^`{|}~_]/ |
| |
| // 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 && !punctuationExppresion.test(value.charAt(index))) { |
| index += 1 |
| } |
| |
| result.push(value.slice(start, index)) |
| |
| // Advance `position` to the next punctuation character. |
| while ( |
| position < count && |
| !punctuationExppresion.test(identifier.charAt(position)) |
| ) { |
| position += 1 |
| } |
| |
| // Take next punctuation characters from `identifier`. |
| start = position |
| |
| while ( |
| position < count && |
| punctuationExppresion.test(identifier.charAt(position)) |
| ) { |
| if (identifier.charAt(position) === ampersand) { |
| position += entityPrefixLength(identifier.slice(position)) |
| } |
| |
| position += 1 |
| } |
| |
| result.push(identifier.slice(start, position)) |
| |
| // Advance `index` to the next non-punctuation character. |
| while (index < length && punctuationExppresion.test(value.charAt(index))) { |
| index += 1 |
| } |
| } |
| |
| return result.join('') |
| } |