diff --git a/public/app/plugins/datasource/loki/syntax.test.ts b/public/app/plugins/datasource/loki/syntax.test.ts new file mode 100644 index 00000000000..7a5fcf18568 --- /dev/null +++ b/public/app/plugins/datasource/loki/syntax.test.ts @@ -0,0 +1,22 @@ +import syntax from './syntax'; +import Prism from 'prismjs'; + +describe('Loki syntax', () => { + it('should highlight Loki query correctly', () => { + expect(Prism.highlight('{key="val#ue"}', syntax, 'loki')).toBe( + '{key="val#ue"}' + ); + expect(Prism.highlight('{key="#value"}', syntax, 'loki')).toBe( + '{key="#value"}' + ); + expect(Prism.highlight('{key="value#"}', syntax, 'loki')).toBe( + '{key="value#"}' + ); + expect(Prism.highlight('#test{key="value"}', syntax, 'loki')).toBe( + '#test{key="value"}' + ); + expect(Prism.highlight('{key="value"}#test', syntax, 'loki')).toBe( + '{key="value"}#test' + ); + }); +}); diff --git a/public/app/plugins/datasource/loki/syntax.ts b/public/app/plugins/datasource/loki/syntax.ts index f42c337eacc..fc2406479cf 100644 --- a/public/app/plugins/datasource/loki/syntax.ts +++ b/public/app/plugins/datasource/loki/syntax.ts @@ -69,8 +69,7 @@ export const FUNCTIONS = [...AGGREGATION_OPERATORS, ...RANGE_VEC_FUNCTIONS]; const tokenizer: Grammar = { comment: { - pattern: /(^|[^\n])#.*/, - lookbehind: true, + pattern: /#.*/, }, 'context-aggregation': { pattern: /((without|by)\s*)\([^)]*\)/, // by () @@ -85,11 +84,15 @@ const tokenizer: Grammar = { }, 'context-labels': { pattern: /\{[^}]*(?=})/, - lookbehind: true, + greedy: true, inside: { + comment: { + pattern: /#.*/, + }, 'label-key': { pattern: /[a-z_]\w*(?=\s*(=|!=|=~|!~))/, alias: 'attr-name', + greedy: true, }, 'label-value': { pattern: /"(?:\\.|[^\\"])*"/, diff --git a/public/app/plugins/datasource/prometheus/promql.test.ts b/public/app/plugins/datasource/prometheus/promql.test.ts new file mode 100644 index 00000000000..2b0cc20fd1e --- /dev/null +++ b/public/app/plugins/datasource/prometheus/promql.test.ts @@ -0,0 +1,22 @@ +import promql from './promql'; +import Prism from 'prismjs'; + +describe('Loki syntax', () => { + it('should highlight Loki query correctly', () => { + expect(Prism.highlight('{key="val#ue"}', promql, 'promql')).toBe( + '{key="val#ue"}' + ); + expect(Prism.highlight('{key="#value"}', promql, 'promql')).toBe( + '{key="#value"}' + ); + expect(Prism.highlight('{key="value#"}', promql, 'promql')).toBe( + '{key="value#"}' + ); + expect(Prism.highlight('#test{key="value"}', promql, 'promql')).toBe( + '#test{key="value"}' + ); + expect(Prism.highlight('{key="value"}#test', promql, 'promql')).toBe( + '{key="value"}#test' + ); + }); +}); diff --git a/public/app/plugins/datasource/prometheus/promql.ts b/public/app/plugins/datasource/prometheus/promql.ts index 0bde2da9c2f..d4b68200ba6 100644 --- a/public/app/plugins/datasource/prometheus/promql.ts +++ b/public/app/plugins/datasource/prometheus/promql.ts @@ -377,8 +377,7 @@ export const FUNCTIONS = [ const tokenizer = { comment: { - pattern: /(^|[^\n])#.*/, - lookbehind: true, + pattern: /#.*/, }, 'context-aggregation': { pattern: /((by|without)\s*)\([^)]*\)/, // by () @@ -393,10 +392,15 @@ const tokenizer = { }, 'context-labels': { pattern: /\{[^}]*(?=})/, + greedy: true, inside: { + comment: { + pattern: /#.*/, + }, 'label-key': { pattern: /[a-z_]\w*(?=\s*(=|!=|=~|!~))/, alias: 'attr-name', + greedy: true, }, 'label-value': { pattern: /"(?:\\.|[^\\"])*"/,