0
|
1 // CodeMirror, copyright (c) by Marijn Haverbeke and others
|
|
2 // Distributed under an MIT license: https://codemirror.net/5/LICENSE
|
|
3
|
|
4 (function(mod) {
|
|
5 if (typeof exports == "object" && typeof module == "object") // CommonJS
|
|
6 mod(require("../../lib/codemirror"));
|
|
7 else if (typeof define == "function" && define.amd) // AMD
|
|
8 define(["../../lib/codemirror"], mod);
|
|
9 else // Plain browser env
|
|
10 mod(CodeMirror);
|
|
11 })(function(CodeMirror) {
|
|
12 "use strict";
|
|
13
|
|
14 CodeMirror.defineMode("solr", function() {
|
|
15 "use strict";
|
|
16
|
|
17 var isStringChar = /[^\s\|\!\+\-\*\?\~\^\&\:\(\)\[\]\{\}\"\\]/;
|
|
18 var isOperatorChar = /[\|\!\+\-\*\?\~\^\&]/;
|
|
19 var isOperatorString = /^(OR|AND|NOT|TO)$/i;
|
|
20
|
|
21 function isNumber(word) {
|
|
22 return parseFloat(word).toString() === word;
|
|
23 }
|
|
24
|
|
25 function tokenString(quote) {
|
|
26 return function(stream, state) {
|
|
27 var escaped = false, next;
|
|
28 while ((next = stream.next()) != null) {
|
|
29 if (next == quote && !escaped) break;
|
|
30 escaped = !escaped && next == "\\";
|
|
31 }
|
|
32
|
|
33 if (!escaped) state.tokenize = tokenBase;
|
|
34 return "string";
|
|
35 };
|
|
36 }
|
|
37
|
|
38 function tokenOperator(operator) {
|
|
39 return function(stream, state) {
|
|
40 var style = "operator";
|
|
41 if (operator == "+")
|
|
42 style += " positive";
|
|
43 else if (operator == "-")
|
|
44 style += " negative";
|
|
45 else if (operator == "|")
|
|
46 stream.eat(/\|/);
|
|
47 else if (operator == "&")
|
|
48 stream.eat(/\&/);
|
|
49 else if (operator == "^")
|
|
50 style += " boost";
|
|
51
|
|
52 state.tokenize = tokenBase;
|
|
53 return style;
|
|
54 };
|
|
55 }
|
|
56
|
|
57 function tokenWord(ch) {
|
|
58 return function(stream, state) {
|
|
59 var word = ch;
|
|
60 while ((ch = stream.peek()) && ch.match(isStringChar) != null) {
|
|
61 word += stream.next();
|
|
62 }
|
|
63
|
|
64 state.tokenize = tokenBase;
|
|
65 if (isOperatorString.test(word))
|
|
66 return "operator";
|
|
67 else if (isNumber(word))
|
|
68 return "number";
|
|
69 else if (stream.peek() == ":")
|
|
70 return "field";
|
|
71 else
|
|
72 return "string";
|
|
73 };
|
|
74 }
|
|
75
|
|
76 function tokenBase(stream, state) {
|
|
77 var ch = stream.next();
|
|
78 if (ch == '"')
|
|
79 state.tokenize = tokenString(ch);
|
|
80 else if (isOperatorChar.test(ch))
|
|
81 state.tokenize = tokenOperator(ch);
|
|
82 else if (isStringChar.test(ch))
|
|
83 state.tokenize = tokenWord(ch);
|
|
84
|
|
85 return (state.tokenize != tokenBase) ? state.tokenize(stream, state) : null;
|
|
86 }
|
|
87
|
|
88 return {
|
|
89 startState: function() {
|
|
90 return {
|
|
91 tokenize: tokenBase
|
|
92 };
|
|
93 },
|
|
94
|
|
95 token: function(stream, state) {
|
|
96 if (stream.eatSpace()) return null;
|
|
97 return state.tokenize(stream, state);
|
|
98 }
|
|
99 };
|
|
100 });
|
|
101
|
|
102 CodeMirror.defineMIME("text/x-solr", "solr");
|
|
103
|
|
104 });
|