61 lines
1.6 KiB
JavaScript
61 lines
1.6 KiB
JavaScript
'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('');
|
|
}
|