You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
30 lines
1.1 KiB
30 lines
1.1 KiB
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 |
|
}
|
|
|