index.js 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. import { decodeNamedCharacterReference } from 'decode-named-character-reference';
  2. import { decodeNumericCharacterReference } from 'micromark-util-decode-numeric-character-reference';
  3. const characterEscapeOrReference = /\\([!-/:-@[-`{-~])|&(#(?:\d{1,7}|x[\da-f]{1,6})|[\da-z]{1,31});/gi;
  4. /**
  5. * Decode markdown strings (which occur in places such as fenced code info
  6. * strings, destinations, labels, and titles).
  7. *
  8. * The “string” content type allows character escapes and -references.
  9. * This decodes those.
  10. *
  11. * @param {string} value
  12. * Value to decode.
  13. * @returns {string}
  14. * Decoded value.
  15. */
  16. export function decodeString(value) {
  17. return value.replace(characterEscapeOrReference, decode);
  18. }
  19. /**
  20. * @param {string} $0
  21. * Match.
  22. * @param {string} $1
  23. * Character escape.
  24. * @param {string} $2
  25. * Character reference.
  26. * @returns {string}
  27. * Decoded value
  28. */
  29. function decode($0, $1, $2) {
  30. if ($1) {
  31. // Escape.
  32. return $1;
  33. }
  34. // Reference.
  35. const head = $2.charCodeAt(0);
  36. if (head === 35) {
  37. const head = $2.charCodeAt(1);
  38. const hex = head === 120 || head === 88;
  39. return decodeNumericCharacterReference($2.slice(hex ? 2 : 1), hex ? 16 : 10);
  40. }
  41. return decodeNamedCharacterReference($2) || $0;
  42. }