68 lines
1.7 KiB
JavaScript
68 lines
1.7 KiB
JavaScript
'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('')
|
||
}
|