| 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 |
| } |