123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146 |
- (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));
|