/** | |
* Normalize an identifier (as found in references, definitions). | |
* | |
* Collapses markdown whitespace, trim, and then lower- and uppercase. | |
* | |
* Some characters are considered “uppercase”, such as U+03F4 (`ϴ`), but if their | |
* lowercase counterpart (U+03B8 (`θ`)) is uppercased will result in a different | |
* uppercase character (U+0398 (`Θ`)). | |
* So, to get a canonical form, we perform both lower- and uppercase. | |
* | |
* Using uppercase last makes sure keys will never interact with default | |
* prototypal values (such as `constructor`): nothing in the prototype of | |
* `Object` is uppercase. | |
* | |
* @param {string} value | |
* Identifier to normalize. | |
* @returns {string} | |
* Normalized identifier. | |
*/ | |
export function normalizeIdentifier(value) { | |
return ( | |
value | |
// Collapse markdown whitespace. | |
.replace(/[\t\n\r ]+/g, ' ') | |
// Trim. | |
.replace(/^ | $/g, '') | |
// Some characters are considered “uppercase”, but if their lowercase | |
// counterpart is uppercased will result in a different uppercase | |
// character. | |
// Hence, to get that form, we perform both lower- and uppercase. | |
// Upper case makes sure keys will not interact with default prototypal | |
// methods: no method is uppercase. | |
.toLowerCase() | |
.toUpperCase() | |
) | |
} | |