| 123456789101112131415161718192021222324252627282930313233343536373839404142434445 |
- import { decodeNamedCharacterReference } from 'decode-named-character-reference';
- import { decodeNumericCharacterReference } from 'micromark-util-decode-numeric-character-reference';
- const characterEscapeOrReference = /\\([!-/:-@[-`{-~])|&(#(?:\d{1,7}|x[\da-f]{1,6})|[\da-z]{1,31});/gi;
- /**
- * Decode markdown strings (which occur in places such as fenced code info
- * strings, destinations, labels, and titles).
- *
- * The “string” content type allows character escapes and -references.
- * This decodes those.
- *
- * @param {string} value
- * Value to decode.
- * @returns {string}
- * Decoded value.
- */
- export function decodeString(value) {
- return value.replace(characterEscapeOrReference, decode);
- }
- /**
- * @param {string} $0
- * Match.
- * @param {string} $1
- * Character escape.
- * @param {string} $2
- * Character reference.
- * @returns {string}
- * Decoded value
- */
- function decode($0, $1, $2) {
- if ($1) {
- // Escape.
- return $1;
- }
- // Reference.
- const head = $2.charCodeAt(0);
- if (head === 35) {
- const head = $2.charCodeAt(1);
- const hex = head === 120 || head === 88;
- return decodeNumericCharacterReference($2.slice(hex ? 2 : 1), hex ? 16 : 10);
- }
- return decodeNamedCharacterReference($2) || $0;
- }
|