123456789101112131415161718192021222324252627282930313233343536373839404142 |
- 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
- * @param {string} $1
- * @param {string} $2
- * @returns {string}
- */
- 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
- }
|