UNPKG

2.26 kBJavaScriptView Raw
1(function (Prism) {
2
3 var javaDocLike = Prism.languages.javadoclike = {
4 'parameter': {
5 pattern: /(^\s*(?:\/{3}|\*|\/\*\*)\s*@(?:param|arg|arguments)\s+)\w+/m,
6 lookbehind: true
7 },
8 'keyword': {
9 // keywords are the first word in a line preceded be an `@` or surrounded by curly braces.
10 // @word, {@word}
11 pattern: /(^\s*(?:\/{3}|\*|\/\*\*)\s*|\{)@[a-z][a-zA-Z-]+\b/m,
12 lookbehind: true
13 },
14 'punctuation': /[{}]/
15 };
16
17
18 /**
19 * Adds doc comment support to the given language and calls a given callback on each doc comment pattern.
20 *
21 * @param {string} lang the language add doc comment support to.
22 * @param {(pattern: {inside: {rest: undefined}}) => void} callback the function called with each doc comment pattern as argument.
23 */
24 function docCommentSupport(lang, callback) {
25 var tokenName = 'doc-comment';
26
27 var grammar = Prism.languages[lang];
28 if (!grammar) {
29 return;
30 }
31 var token = grammar[tokenName];
32
33 if (!token) {
34 // add doc comment: /** */
35 var definition = {};
36 definition[tokenName] = {
37 pattern: /(^|[^\\])\/\*\*[^/][\s\S]*?(?:\*\/|$)/,
38 lookbehind: true,
39 alias: 'comment'
40 };
41
42 grammar = Prism.languages.insertBefore(lang, 'comment', definition);
43 token = grammar[tokenName];
44 }
45
46 if (token instanceof RegExp) { // convert regex to object
47 token = grammar[tokenName] = { pattern: token };
48 }
49
50 if (Array.isArray(token)) {
51 for (var i = 0, l = token.length; i < l; i++) {
52 if (token[i] instanceof RegExp) {
53 token[i] = { pattern: token[i] };
54 }
55 callback(token[i]);
56 }
57 } else {
58 callback(token);
59 }
60 }
61
62 /**
63 * Adds doc-comment support to the given languages for the given documentation language.
64 *
65 * @param {string[]|string} languages
66 * @param {Object} docLanguage
67 */
68 function addSupport(languages, docLanguage) {
69 if (typeof languages === 'string') {
70 languages = [languages];
71 }
72
73 languages.forEach(function (lang) {
74 docCommentSupport(lang, function (pattern) {
75 if (!pattern.inside) {
76 pattern.inside = {};
77 }
78 pattern.inside.rest = docLanguage;
79 });
80 });
81 }
82
83 Object.defineProperty(javaDocLike, 'addSupport', { value: addSupport });
84
85 javaDocLike.addSupport(['java', 'javascript', 'php'], javaDocLike);
86
87}(Prism));