All checks were successful
Publish To Prod / deploy_and_publish (push) Successful in 35s
31 lines
1.1 KiB
JavaScript
31 lines
1.1 KiB
JavaScript
module.exports = association
|
||
|
||
var decode = require('parse-entities/decode-entity')
|
||
|
||
var characterEscape = /\\([!-/:-@[-`{-~])/g
|
||
var characterReference = /&(#(\d{1,7}|x[\da-f]{1,6})|[\da-z]{1,31});/gi
|
||
|
||
// The `label` of an association is the string value: character escapes and
|
||
// references work, and casing is intact.
|
||
// The `identifier` is used to match one association to another: controversially,
|
||
// character escapes and references don’t work in this matching: `©` does
|
||
// not match `©`, and `\+` does not match `+`.
|
||
// But casing is ignored (and whitespace) is trimmed and collapsed: ` A\nb`
|
||
// matches `a b`.
|
||
// So, we do prefer the label when figuring out how we’re going to serialize:
|
||
// it has whitespace, casing, and we can ignore most useless character escapes
|
||
// and all character references.
|
||
function association(node) {
|
||
if (node.label || !node.identifier) {
|
||
return node.label || ''
|
||
}
|
||
|
||
return node.identifier
|
||
.replace(characterEscape, '$1')
|
||
.replace(characterReference, decodeIfPossible)
|
||
}
|
||
|
||
function decodeIfPossible($0, $1) {
|
||
return decode($1) || $0
|
||
}
|