prism-custom-class.js 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. (function () {
  2. if (
  3. (typeof self === 'undefined' || !self.Prism) &&
  4. (typeof global === 'undefined' || !global.Prism)
  5. ) {
  6. return;
  7. }
  8. /**
  9. * @callback ClassMapper
  10. * @param {string} className
  11. * @param {string} language
  12. * @returns {string}
  13. *
  14. * @callback ClassAdder
  15. * @param {ClassAdderEnvironment} env
  16. * @returns {undefined | string | string[]}
  17. *
  18. * @typedef ClassAdderEnvironment
  19. * @property {string} language
  20. * @property {string} type
  21. * @property {string} content
  22. */
  23. // options
  24. /** @type {ClassAdder | undefined} */
  25. var adder;
  26. /** @type {ClassMapper | undefined} */
  27. var mapper;
  28. /** @type {string} */
  29. var prefixString = '';
  30. Prism.plugins.customClass = {
  31. /**
  32. * Sets the function which can be used to add custom aliases to any token.
  33. *
  34. * @param {ClassAdder} classAdder
  35. */
  36. add: function (classAdder) {
  37. adder = classAdder;
  38. },
  39. /**
  40. * Maps all class names using the given object or map function.
  41. *
  42. * This does not affect the prefix.
  43. *
  44. * @param {Object<string, string> | ClassMapper} classMapper
  45. */
  46. map: function map(classMapper) {
  47. if (typeof classMapper === 'function') {
  48. mapper = classMapper;
  49. } else {
  50. mapper = function (className) {
  51. return classMapper[className] || className;
  52. };
  53. }
  54. },
  55. /**
  56. * Adds the given prefix to all class names.
  57. *
  58. * @param {string} string
  59. */
  60. prefix: function prefix(string) {
  61. prefixString = string || '';
  62. }
  63. }
  64. Prism.hooks.add('wrap', function (env) {
  65. if (adder) {
  66. var result = adder({
  67. content: env.content,
  68. type: env.type,
  69. language: env.language
  70. });
  71. if (Array.isArray(result)) {
  72. env.classes.push.apply(env.classes, result);
  73. } else if (result) {
  74. env.classes.push(result);
  75. }
  76. }
  77. if (!mapper && !prefixString) {
  78. return;
  79. }
  80. env.classes = env.classes.map(function (c) {
  81. return prefixString + (mapper ? mapper(c, env.language) : c);
  82. });
  83. });
  84. })();