Files
30-seconds-of-code/node_modules/remark-stringify/lib/util/copy-identifier-encoding.js
2019-08-20 15:52:05 +02:00

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