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