| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960 |
- '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('');
- }
|