UNPKG

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