diff options
| author | Armand Philippot <git@armandphilippot.com> | 2021-12-30 19:47:21 +0100 |
|---|---|---|
| committer | Armand Philippot <git@armandphilippot.com> | 2021-12-30 19:47:21 +0100 |
| commit | a98b5ea6fe8e8cc98a55e0fd793e6e8660ea31c1 (patch) | |
| tree | 542810ab5aef99150db228bb54fd58303dcb31c7 /public/prism/prism-promql.js | |
| parent | ab355897a12b7bda1089a44de326d41455a0f7a3 (diff) | |
chore: add prismjs for syntax highlighting
Diffstat (limited to 'public/prism/prism-promql.js')
| -rw-r--r-- | public/prism/prism-promql.js | 102 |
1 files changed, 102 insertions, 0 deletions
diff --git a/public/prism/prism-promql.js b/public/prism/prism-promql.js new file mode 100644 index 0000000..13f106e --- /dev/null +++ b/public/prism/prism-promql.js @@ -0,0 +1,102 @@ +// Thanks to: https://github.com/prometheus-community/monaco-promql/blob/master/src/promql/promql.ts +// As well as: https://kausal.co/blog/slate-prism-add-new-syntax-promql/ + +(function (Prism) { + // PromQL Aggregation Operators + // (https://prometheus.io/docs/prometheus/latest/querying/operators/#aggregation-operators) + var aggregations = [ + 'sum', + 'min', + 'max', + 'avg', + 'group', + 'stddev', + 'stdvar', + 'count', + 'count_values', + 'bottomk', + 'topk', + 'quantile', + ]; + + // PromQL vector matching + the by and without clauses + // (https://prometheus.io/docs/prometheus/latest/querying/operators/#vector-matching) + var vectorMatching = [ + 'on', + 'ignoring', + 'group_right', + 'group_left', + 'by', + 'without', + ]; + + // PromQL offset modifier + // (https://prometheus.io/docs/prometheus/latest/querying/basics/#offset-modifier) + var offsetModifier = ['offset']; + + var keywords = aggregations.concat(vectorMatching, offsetModifier); + + Prism.languages.promql = { + comment: { + pattern: /(^[ \t]*)#.*/m, + lookbehind: true, + }, + 'vector-match': { + // Match the comma-separated label lists inside vector matching: + pattern: new RegExp( + '((?:' + vectorMatching.join('|') + ')\\s*)\\([^)]*\\)' + ), + lookbehind: true, + inside: { + 'label-key': { + pattern: /\b[^,]+\b/, + alias: 'attr-name', + }, + punctuation: /[(),]/, + }, + }, + 'context-labels': { + pattern: /\{[^{}]*\}/, + inside: { + 'label-key': { + pattern: /\b[a-z_]\w*(?=\s*(?:=|![=~]))/, + alias: 'attr-name', + }, + 'label-value': { + pattern: /(["'`])(?:\\[\s\S]|(?!\1)[^\\])*\1/, + greedy: true, + alias: 'attr-value', + }, + punctuation: /\{|\}|=~?|![=~]|,/, + }, + }, + 'context-range': [ + { + pattern: /\[[\w\s:]+\]/, // [1m] + inside: { + punctuation: /\[|\]|:/, + 'range-duration': { + pattern: /\b(?:\d+(?:[smhdwy]|ms))+\b/i, + alias: 'number', + }, + }, + }, + { + pattern: /(\boffset\s+)\w+/, // offset 1m + lookbehind: true, + inside: { + 'range-duration': { + pattern: /\b(?:\d+(?:[smhdwy]|ms))+\b/i, + alias: 'number', + }, + }, + }, + ], + keyword: new RegExp('\\b(?:' + keywords.join('|') + ')\\b', 'i'), + function: /\b[a-z_]\w*(?=\s*\()/i, + number: + /[-+]?(?:(?:\b\d+(?:\.\d+)?|\B\.\d+)(?:e[-+]?\d+)?\b|\b(?:0x[0-9a-f]+|nan|inf)\b)/i, + operator: /[\^*/%+-]|==|!=|<=|<|>=|>|\b(?:and|or|unless)\b/i, + punctuation: /[{};()`,.[\]]/, + }; +})(Prism); |
