You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
146 lines
2.9 KiB
146 lines
2.9 KiB
(function (Prism) { |
|
|
|
// see https://github.com/cooklang/spec/blob/main/EBNF.md |
|
|
|
var single_token_suffix = /(?:(?!\s)[\d$+<=a-zA-Z\x80-\uFFFF])+/.source; |
|
var multi_token_infix = /[^{}@#]+/.source; |
|
var multi_token_suffix = /\{[^}#@]*\}/.source; |
|
|
|
var multi_token = multi_token_infix + multi_token_suffix; |
|
|
|
var timer_units = /(?:h|hours|hrs|m|min|minutes)/.source; |
|
|
|
var amount_group_impl = { |
|
pattern: /\{[^{}]*\}/, |
|
inside: { |
|
'amount': { |
|
pattern: /([\{|])[^{}|*%]+/, |
|
lookbehind: true, |
|
alias: 'number', |
|
}, |
|
'unit': { |
|
pattern: /(%)[^}]+/, |
|
lookbehind: true, |
|
alias: 'symbol', |
|
}, |
|
'servings-scaler': { |
|
pattern: /\*/, |
|
alias: 'operator', |
|
}, |
|
'servings-alternative-separator': { |
|
pattern: /\|/, |
|
alias: 'operator', |
|
}, |
|
'unit-separator': { |
|
pattern: /(?:%|(\*)%)/, |
|
lookbehind: true, |
|
alias: 'operator', |
|
}, |
|
'punctuation': /[{}]/, |
|
} |
|
}; |
|
|
|
|
|
Prism.languages.cooklang = { |
|
'comment': { |
|
// [- comment -] |
|
// -- comment |
|
pattern: /\[-[\s\S]*?-\]|--.*/, |
|
greedy: true, |
|
}, |
|
'meta': { // >> key: value |
|
pattern: />>.*:.*/, |
|
inside: { |
|
'property': { // key: |
|
pattern: /(>>\s*)[^\s:](?:[^:]*[^\s:])?/, |
|
lookbehind: true, |
|
} |
|
} |
|
}, |
|
'cookware-group': { // #...{...}, #... |
|
pattern: new RegExp('#(?:' |
|
+ multi_token |
|
+ '|' |
|
+ single_token_suffix |
|
+ ')' |
|
), |
|
inside: { |
|
'cookware': { |
|
pattern: new RegExp('(^#)(?:' |
|
+ multi_token_infix |
|
+ ')' |
|
), |
|
lookbehind: true, |
|
alias: 'variable', |
|
}, |
|
'cookware-keyword': { |
|
pattern: /^#/, |
|
alias: 'keyword', |
|
}, |
|
'quantity-group': { |
|
pattern: new RegExp(/\{[^{}@#]*\}/), |
|
inside: { |
|
'quantity': { |
|
pattern: new RegExp(/(^\{)/.source + multi_token_infix), |
|
lookbehind: true, |
|
alias: 'number', |
|
}, |
|
'punctuation': /[{}]/, |
|
} |
|
} |
|
}, |
|
}, |
|
'ingredient-group': { // @...{...}, @... |
|
pattern: new RegExp('@(?:' |
|
+ multi_token |
|
+ '|' |
|
+ single_token_suffix |
|
+ ')'), |
|
inside: { |
|
'ingredient': { |
|
pattern: new RegExp('(^@)(?:' |
|
+ multi_token_infix |
|
+ ')'), |
|
lookbehind: true, |
|
alias: 'variable', |
|
}, |
|
'ingredient-keyword': { |
|
pattern: /^@/, |
|
alias: 'keyword', |
|
}, |
|
'amount-group': amount_group_impl, |
|
} |
|
}, |
|
'timer-group': { // ~timer{...} |
|
// eslint-disable-next-line regexp/sort-alternatives |
|
pattern: /~(?!\s)[^@#~{}]*\{[^{}]*\}/, |
|
inside: { |
|
'timer': { |
|
pattern: /(^~)[^{]+/, |
|
lookbehind: true, |
|
alias: 'variable', |
|
}, |
|
'duration-group': { // {...} |
|
pattern: /\{[^{}]*\}/, |
|
inside: { |
|
'punctuation': /[{}]/, |
|
'unit': { |
|
pattern: new RegExp(/(%\s*)/.source + timer_units + /\b/.source), |
|
lookbehind: true, |
|
alias: 'symbol', |
|
}, |
|
'operator': /%/, |
|
'duration': { |
|
pattern: /\d+/, |
|
alias: 'number', |
|
}, |
|
} |
|
}, |
|
'timer-keyword': { |
|
pattern: /^~/, |
|
alias: 'keyword', |
|
}, |
|
} |
|
} |
|
}; |
|
}(Prism));
|
|
|