UNPKG

3.02 kBJavaScriptView Raw
1(function (Prism) {
2
3 // see https://github.com/cooklang/spec/blob/main/EBNF.md
4
5 var single_token_suffix = /(?:(?!\s)[\d$+<=a-zA-Z\x80-\uFFFF])+/.source;
6 var multi_token_infix = /[^{}@#]+/.source;
7 var multi_token_suffix = /\{[^}#@]*\}/.source;
8
9 var multi_token = multi_token_infix + multi_token_suffix;
10
11 var timer_units = /(?:h|hours|hrs|m|min|minutes)/.source;
12
13 var amount_group_impl = {
14 pattern: /\{[^{}]*\}/,
15 inside: {
16 'amount': {
17 pattern: /([\{|])[^{}|*%]+/,
18 lookbehind: true,
19 alias: 'number',
20 },
21 'unit': {
22 pattern: /(%)[^}]+/,
23 lookbehind: true,
24 alias: 'symbol',
25 },
26 'servings-scaler': {
27 pattern: /\*/,
28 alias: 'operator',
29 },
30 'servings-alternative-separator': {
31 pattern: /\|/,
32 alias: 'operator',
33 },
34 'unit-separator': {
35 pattern: /(?:%|(\*)%)/,
36 lookbehind: true,
37 alias: 'operator',
38 },
39 'punctuation': /[{}]/,
40 }
41 };
42
43
44 Prism.languages.cooklang = {
45 'comment': {
46 // [- comment -]
47 // -- comment
48 pattern: /\[-[\s\S]*?-\]|--.*/,
49 greedy: true,
50 },
51 'meta': { // >> key: value
52 pattern: />>.*:.*/,
53 inside: {
54 'property': { // key:
55 pattern: /(>>\s*)[^\s:](?:[^:]*[^\s:])?/,
56 lookbehind: true,
57 }
58 }
59 },
60 'cookware-group': { // #...{...}, #...
61 pattern: new RegExp('#(?:'
62 + multi_token
63 + '|'
64 + single_token_suffix
65 + ')'
66 ),
67 inside: {
68 'cookware': {
69 pattern: new RegExp('(^#)(?:'
70 + multi_token_infix
71 + ')'
72 ),
73 lookbehind: true,
74 alias: 'variable',
75 },
76 'cookware-keyword': {
77 pattern: /^#/,
78 alias: 'keyword',
79 },
80 'quantity-group': {
81 pattern: new RegExp(/\{[^{}@#]*\}/),
82 inside: {
83 'quantity': {
84 pattern: new RegExp(/(^\{)/.source + multi_token_infix),
85 lookbehind: true,
86 alias: 'number',
87 },
88 'punctuation': /[{}]/,
89 }
90 }
91 },
92 },
93 'ingredient-group': { // @...{...}, @...
94 pattern: new RegExp('@(?:'
95 + multi_token
96 + '|'
97 + single_token_suffix
98 + ')'),
99 inside: {
100 'ingredient': {
101 pattern: new RegExp('(^@)(?:'
102 + multi_token_infix
103 + ')'),
104 lookbehind: true,
105 alias: 'variable',
106 },
107 'ingredient-keyword': {
108 pattern: /^@/,
109 alias: 'keyword',
110 },
111 'amount-group': amount_group_impl,
112 }
113 },
114 'timer-group': { // ~timer{...}
115 // eslint-disable-next-line regexp/sort-alternatives
116 pattern: /~(?!\s)[^@#~{}]*\{[^{}]*\}/,
117 inside: {
118 'timer': {
119 pattern: /(^~)[^{]+/,
120 lookbehind: true,
121 alias: 'variable',
122 },
123 'duration-group': { // {...}
124 pattern: /\{[^{}]*\}/,
125 inside: {
126 'punctuation': /[{}]/,
127 'unit': {
128 pattern: new RegExp(/(%\s*)/.source + timer_units + /\b/.source),
129 lookbehind: true,
130 alias: 'symbol',
131 },
132 'operator': /%/,
133 'duration': {
134 pattern: /\d+/,
135 alias: 'number',
136 },
137 }
138 },
139 'timer-keyword': {
140 pattern: /^~/,
141 alias: 'keyword',
142 },
143 }
144 }
145 };
146}(Prism));